home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / greversi / src.lzh / src / graph.s < prev    next >
Text File  |  2000-02-04  |  74KB  |  3,487 lines

  1. ;----------------------------------------------------------------
  2. ;    greversi.x v0.14 (2000.02.04) by M.Kamada
  3. ;    graph.s 描画・入力ルーチン
  4. ;----------------------------------------------------------------
  5.  
  6.     .include    doscall.mac
  7.     .include    iocscall.mac
  8.  
  9.     .include    iomap.equ
  10.     .include    iocswork.equ
  11.  
  12.     .include    const.equ
  13.  
  14. BG_PAGE        equ    0        ;BGはBG0の1枚だけ
  15. BG_TEXT        equ    1        ;BGテキスト1を使用する
  16.                     ;→パターンは192個使用可能
  17.  
  18. NULL_PATTERN    equ    0        ;BGの空きのパターン(1個)の番号
  19. MASK_PATTERN    equ    1        ;BGのマスクのパターン(2個)の番号
  20. CURSOR_PATTERN    equ    3        ;マウスカーソルのパターン(1個)の番号
  21. TURN_PATTERN    equ    4        ;手番表示のパターン(1個)の番号
  22. NUMBER_PATTERN    equ    10        ;数字のパターン(4*10=40個)の番号の先頭
  23. MOJI_PATTERN    equ    50        ;文字のパターンの番号の先頭
  24.  
  25. TURN_PALETTE    equ    0        ;手番表示のパレットブロックの番号
  26. MASK_PALETTE    equ    1        ;BGのマスクのパレットブロックの番号
  27. NUMBER_PALETTE    equ    2        ;数字のパレットブロックの番号
  28. BLACK_PALETTE    equ    NUMBER_PALETTE    ;黒の文字のパレットブロックの番号
  29. WHITE_PALETTE    equ    NUMBER_PALETTE    ;白の文字のパレットブロックの番号
  30. WINDOW0_PALETTE    equ    3        ;ウィンドウ0の文字のパレットブロックの番号
  31. WINDOW1_PALETTE    equ    4        ;ウィンドウ1の文字のパレットブロックの番号
  32. CURSOR_PALETTE    equ    5        ;マウスカーソルのパレットブロックの番号
  33.  
  34. CURSOR_SPRITE    equ    0        ;マウスカーソルのスプライトの番号
  35. TURN_SPRITE    equ    1        ;手番表示のスプライト(2個)の番号
  36. COUNTER_SPRITE    equ    10        ;カウンタの数字のスプライト(6*4=24個)の番号の先頭
  37. MOJI_SPRITE    equ    34        ;文字のスプライトの番号の先頭
  38.  
  39. MOJI_BLACK_X    equ    10        ;黒のBG表示位置のX座標
  40. MOJI_BLACK_Y    equ    2        ;黒のBG表示位置のY座標
  41. MOJI_WHITE_X    equ    17        ;白のBG表示位置のX座標
  42. MOJI_WHITE_Y    equ    2        ;白のBG表示位置のY座標
  43.  
  44. MOJI_PASS_X    equ    14        ;パスのBG表示位置のX座標
  45. MOJI_PASS_Y    equ    15        ;パスのBG表示位置のY座標
  46.  
  47. NUMBER_WIDTH    equ    20        ;数字のパターンの幅
  48.  
  49. BLACK_COUNT_X    equ    16*MOJI_BLACK_X+24+12-(24-NUMBER_WIDTH)/2    ;黒の石の数の表示位置のX座標
  50. BLACK_COUNT_Y    equ    16*MOJI_BLACK_Y    ;黒の石の数の表示位置のY座標
  51. WHITE_COUNT_X    equ    16*MOJI_WHITE_X+24+12-(24-NUMBER_WIDTH)/2    ;白の石の数の表示位置のX座標
  52. WHITE_COUNT_Y    equ    16*MOJI_WHITE_Y    ;白の石の数の表示位置のY座標
  53.  
  54. PASS_WAIT    equ    100        ;パスの待ち時間(垂直同期単位)
  55.  
  56. CURSOR_HOT_X    equ    0        ;マウスカーソルのホットスポットのX座標(0~15)
  57. CURSOR_HOT_Y    equ    0        ;マウスカーソルのホットスポットのY座標(0~15)
  58.  
  59.   .ifndef _PRIORITY
  60. _PRIORITY    equ    $92
  61.   .endif
  62.  
  63. ;----------------------------------------------------------------
  64. grb    .macro    g,r,b
  65.     .dc.w    (g<<11)+(r<<6)+(b<<1)
  66.     .endm
  67.  
  68. ;----------------------------------------------------------------
  69. ;1マス分の全パターンデータのバッファのサイズ
  70. PATBUF_SIZE_UNIT    equ    1024*230
  71. ;1マス分のGRAMセーブエリアのサイズ
  72. GRAM_SAVE_AREA_SIZE    equ    4096
  73.  
  74. GRAM_SAVE_SEPARATELY    equ    1
  75.  
  76. ;----------------------------------------------------------------
  77. ;位置を入力させる
  78. ;>d0.l:オフセット(255=盤の外,-1=右ボタンが押された)
  79. ;>d1.l:(X座標<<16)+(Y座標)
  80.     .text
  81.     .align    4,$2048
  82. input_pos::
  83. 10:    IOCS    _B_KEYSNS
  84.     tst.l    d0
  85.     beq    20f
  86.     cmp.b    #$03,d0
  87.     bne    @f
  88.     DOS    _KEYSNS
  89. @@:    IOCS    _B_KEYINP
  90.     tst.l    d0
  91.     beq    20f
  92.     cmp.b    #$0D,d0
  93.     beq    93f
  94.     cmp.b    #$1B,d0
  95.     beq    92f
  96.     cmp.b    #' ',d0
  97.     beq    93f
  98.     bra    10b
  99.  
  100. 20:    IOCS    _MS_CURGT
  101.     move.l    d0,d1
  102.  
  103.   .if 0        ;割り込み駆動に変更したので不要
  104.     movem.l    d1-d5/a0,-(sp)
  105.     move.l    #$00000000+CURSOR_SPRITE,d1
  106.     move.w    d0,d3
  107.     swap.w    d0
  108.     move.w    d0,d2
  109.   .if 1
  110.     add.w    #16,d2
  111.     add.w    #16,d3
  112.   .else
  113. ;256×256のマウス座標を画面上のボードにはめ込むとき
  114.     sub.w    #128,d2
  115.     sub.w    #128,d3
  116.     swap.w    d0
  117.     add.w    d0,d0
  118.     add.w    d0,d0
  119.     lea.l    (msconv_table,pc),a0
  120.     adda.w    d0,a0
  121.     muls.w    (a0)+,d2
  122.     muls.w    (a0)+,d3
  123.     asl.l    #2,d2
  124.     asl.l    #2,d3
  125.     clr.w    d2
  126.     clr.w    d3
  127.     swap.w    d2
  128.     swap.w    d3
  129.     add.w    #256,d2
  130.     add.w    #256,d3
  131.   .endif
  132.     move.l    #CURSOR_PALETTE*256+CURSOR_PATTERN,d4
  133.     move.l    #3,d5
  134.     IOCS    _SP_REGST
  135.     movem.l    (sp)+,d1-d5/a0
  136.   .endif
  137.  
  138. ;ボタンが押されるまで待つ
  139.     IOCS    _MS_GETDT
  140.     tst.b    d0
  141.     bne    90f
  142.     tst.w    d0
  143.     beq    10b
  144.  
  145. ;ボタンが離されるまで待つ
  146. @@:    IOCS    _MS_GETDT
  147.     tst.b    d0
  148.     bne    90f
  149.     tst.w    d0
  150.     bne    @b
  151.  
  152.     move.l    a0,-(sp)
  153.     move.l    d1,-(sp)
  154.     add.w    d1,d1
  155.     add.w    d1,d1            ;Y×4
  156.     lea.l    board_map,a0
  157.     movea.l    (a0,d1.w),a0        ;ラスタの先頭
  158.     swap.w    d1            ;X
  159. @@:    move.w    (a0)+,d0
  160.     cmp.w    (a0)+,d1
  161.     bcc    @b            ;-1があるので(d1=-1でない限り)必ず止まる
  162.     cmp.w    #255,d0
  163.     beq    @f
  164.     moveq.l    #$38,d1
  165.     and.w    d0,d1
  166.     lsr.w    #3,d1
  167.     add.w    d1,d0
  168.     add.w    #10,d0
  169. @@:    ext.l    d0
  170.     move.l    (sp)+,d1
  171.     movea.l    (sp)+,a0
  172.  
  173.     tst.l    d0
  174. 99:    rts
  175.  
  176. 92:    moveq.l    #0,d1
  177. 90:    moveq.l    #-1,d0
  178.     bra    99b
  179.  
  180. 93:    moveq.l    #-1,d1
  181.     move.b    d0,d1
  182.     move.l    #255,d0
  183.     bra    99b
  184.  
  185.   .if 0
  186. ;マウス座標からスプライト座標への変換
  187. ;    msarea(0,0,255,255)のとき
  188. ;    sx=(mx-128)*384*sqr(13)/(1168-my)+256
  189. ;    sy=(my-128)*1536/(1168-my)+256
  190. SQR13    fequ    3.60555127546398929311922126747
  191.     .align    4,$2048
  192. msconv_table:
  193. my = 0
  194.   .rept 256
  195.     .dc.w    16384.0*384.0*SQR13/(1168.0-my)
  196.     .dc.w    16384.0*1536.0/(1168.0-my)
  197. my = my+1
  198.   .endm
  199.   .endif
  200.  
  201. ;----------------------------------------------------------------
  202. ;盤の状態を表示する
  203.     .text
  204.     .align    4,$2048
  205. draw_ban::
  206.     movem.l    d0-d5/a0-a1,-(sp)
  207.     bsr    super
  208.     lea.l    ban+P11,a1
  209.     moveq.l    #0,d5
  210.     moveq.l    #8-1,d3
  211. 3:    moveq.l    #8-1,d2
  212. 2:    move.b    (a1)+,d4
  213.     beq    5f            ;空き
  214.     move.l    d5,d0
  215.     subq.b    #B,d4
  216.     bne    41f
  217.     addq.l    #1,black_count
  218.     moveq.l    #0,d1
  219.     bra    42f
  220. 41:    addq.l    #1,white_count
  221.     moveq.l    #36,d1
  222. 42:    bsr    animpat1
  223. 5:    addq.w    #1,d5
  224.     dbra    d2,2b
  225.     addq.l    #1,a1
  226.     dbra    d3,3b
  227.     bsr    user
  228.     movem.l    (sp)+,d0-d5/a0-a1
  229.     rts
  230.  
  231. ;----------------------------------------------------------------
  232. ;終局を表示する
  233. ;<d6.b:自分の石
  234. ;<d7.b:相手の石
  235. ;>n-flag:mi=終了
  236.     .text
  237.     .align    4,$2048
  238. draw_over::
  239.     movem.l    d1-d3/d6-d7/a1-a4,-(sp)
  240.     bsr    super
  241.  
  242.     move.l    #((256-24-8)<<16)+(256-20-32-9),d1
  243.     move.l    #((8+24*2+8-1)<<16)+(9+32+9-1),d2
  244.     bsr    open_window
  245.  
  246.     moveq.l    #0,d0
  247.     bsr    window0_palet
  248.  
  249.     move.l    #MOJI_SPRITE,d1
  250.     move.l    #256-24,d2
  251.     move.l    #256-20-32,d3
  252.     lea.l    (draw_over_string,pc),a1
  253.     bsr    draw_string
  254.  
  255.     moveq.l    #0,d0
  256.     bra    2f
  257. 1:    bsr    keyctrl_vwait
  258.     bsr    window0_palet
  259. 2:    addq.w    #1,d0
  260.     cmp.w    #31,d0
  261.     bls    1b
  262.  
  263.     move.w    black_count+2,d0
  264.     sub.w    white_count+2,d0
  265.     beq    10f            ;引き分け
  266.     bmi    1f
  267. ;黒の勝ち
  268.     lea.l    (draw_over_black_string,pc),a1
  269.     tst.w    white_count+2
  270.     bne    2f
  271.     moveq.l    #64,d0
  272.     bra    2f
  273. ;白の勝ち
  274. 1:    neg.w    d0
  275.     lea.l    (draw_over_white_string,pc),a1
  276.     tst.w    black_count+2
  277.     bne    2f
  278.     moveq.l    #64,d0
  279. 2:    movea.l    d0,a2
  280. ;<a1.l:勝者を示す文字列
  281. ;<a2.l:石差
  282.  
  283.     move.l    #((256-(8+24*7+8)/2)<<16)+(256+20-9),d1
  284.     move.l    #((8+24*7+8-1)<<16)+(9+32+9-1),d2
  285.     bsr    open_window
  286.  
  287.     moveq.l    #0,d0
  288.     bsr    window1_palet
  289.  
  290.     move.l    #MOJI_SPRITE+4*2,d1
  291.     move.l    #256-(24*7)/2,d2
  292.     move.l    #256+20,d3
  293.  
  294.     bsr    draw_string
  295.  
  296.   .if NUMBER_WIDTH<24
  297.     add.w    #24-NUMBER_WIDTH,d2
  298.   .endif
  299.  
  300.     move.l    a2,d0            ;石差
  301.     divu.w    #10,d0            ;石差÷10
  302.     bne    1f
  303. ;石差が1桁のとき
  304.     add.w    #NUMBER_WIDTH,d2
  305.     bra    2f
  306. ;石差が2桁のとき
  307. 1:
  308. ;石差の10の位
  309.     add.w    d0,d0
  310.     add.w    d0,d0
  311.     add.w    #WINDOW1_PALETTE*256+MOJI_PATTERN_0,d0
  312.     move.l    #-1,-(sp)
  313.     move.w    d0,-(sp)
  314.     clr.w    -(sp)
  315.     movea.l    sp,a1
  316.     bsr    draw_string
  317.     addq.l    #8,sp
  318. ;石差の1の位
  319. 2:    swap.w    d0
  320.     add.w    d0,d0
  321.     add.w    d0,d0
  322.     add.w    #WINDOW1_PALETTE*256+MOJI_PATTERN_0,d0
  323.     move.l    #-1,-(sp)
  324.     move.w    d0,-(sp)
  325.     clr.w    -(sp)
  326.     movea.l    sp,a1
  327.     bsr    draw_string
  328.     addq.l    #8,sp
  329.  
  330.   .if NUMBER_WIDTH<24
  331.     add.w    #24-NUMBER_WIDTH,d2
  332.   .endif
  333.  
  334.     lea.l    (draw_over_winner_string,pc),a1
  335.     bsr    draw_string
  336.  
  337.     bra    20f
  338.  
  339. ;引き分け
  340. 10:    suba.l    a2,a2            ;石差
  341.  
  342.     move.l    #((256-(8+24*4+8)/2)<<16)+(256+20-9),d1
  343.     move.l    #((8+24*4+8-1)<<16)+(9+32+9-1),d2
  344.     bsr    open_window
  345.  
  346.     moveq.l    #0,d0
  347.     bsr    window1_palet
  348.  
  349.     move.l    #MOJI_SPRITE+4*2,d1
  350.     move.l    #256-(24*4)/2,d2
  351.     move.l    #256+20,d3
  352.  
  353.     lea.l    (draw_over_draw_string,pc),a1
  354.     bsr    draw_string
  355.  
  356. 20:
  357.  
  358.     movea.l    d1,a4
  359.  
  360.     moveq.l    #0,d0
  361.     bra    2f
  362. 1:    bsr    keyctrl_vwait
  363.     bsr    window1_palet
  364. 2:    addq.w    #1,d0
  365.     cmp.w    #31,d0
  366.     bls    1b
  367.  
  368.     bsr    input_pos
  369.     movea.l    d0,a3
  370.  
  371.     moveq.l    #30,d0
  372. @@:    bsr    keyctrl_vwait
  373.     bsr    window1_palet
  374.     dbra    d0,@b
  375.  
  376.     move.l    #MOJI_SPRITE+4*2,d1
  377.     move.l    a4,d0
  378.     sub.l    d1,d0
  379.     bsr    erase_string
  380.  
  381.     move.l    #((256-(8+24*7+8)/2)<<16)+(256+20-9),d1
  382.     move.l    #((8+24*7+8-1)<<16)+(9+32+9-1),d2
  383.     move.l    a2,d0            ;石差
  384.     bne    @f
  385.     move.l    #((256-(8+24*4+8)/2)<<16)+(256+20-9),d1
  386.     move.l    #((8+24*4+8-1)<<16)+(9+32+9-1),d2
  387. @@:    bsr    close_window
  388.  
  389.     moveq.l    #30,d0
  390. @@:    bsr    keyctrl_vwait
  391.     bsr    window0_palet
  392.     dbra    d0,@b
  393.  
  394.     move.l    #MOJI_SPRITE,d1
  395.     move.l    #4+4,d0
  396.     bsr    erase_string
  397.  
  398.     move.l    #((256-24-8)<<16)+(256-20-32-9),d1
  399.     move.l    #((8+24*2+8-1)<<16)+(9+32+9-1),d2
  400.     bsr    close_window
  401.  
  402.     bsr    user
  403.     move.l    a3,d0
  404.     movem.l    (sp)+,d1-d3/d6-d7/a1-a4
  405.     rts
  406.  
  407. ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  408.     .align    4,$2048
  409. draw_over_string:
  410.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_終
  411.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_局
  412.     .dc.l    -1
  413. draw_over_black_string:
  414.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_黒
  415.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_の
  416.     .dc.l    -1
  417. draw_over_white_string:
  418.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_白
  419.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_の
  420.     .dc.l    -1
  421. draw_over_winner_string:
  422.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_石
  423.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_勝
  424.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_ち
  425.     .dc.l    -1
  426. draw_over_draw_string:
  427.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_引
  428.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_き
  429.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_分
  430.     .dc.l    WINDOW1_PALETTE*256+MOJI_PATTERN_け
  431.     .dc.l    -1
  432.  
  433. ;----------------------------------------------------------------
  434. ;メニューを表示して選択させる
  435. ;>d0.l:-1=キャンセル,0=終了,1=対局
  436.     .text
  437.     .align    4,$2048
  438. draw_menu::
  439.     movem.l    d0-d3/a1/a3-a4,-(sp)
  440.     bsr    super
  441.  
  442.     move.l    #((256-(8+24*5+8)/2)<<16)+(256-(9+32*5+9)/2),d1
  443.     move.l    #(((8+24*5+8)-1)<<16)+((9+32*5+9)-1),d2
  444.     bsr    open_window
  445.  
  446.     moveq.l    #0,d0
  447.     bsr    window0_palet
  448.  
  449.     move.l    #MOJI_SPRITE,d1
  450.  
  451.     move.l    #256-(24*5)/2,d2
  452.     move.l    #256-(32*5)/2,d3
  453.     lea.l    (draw_menu_対局,pc),a1
  454.     bsr    draw_string
  455.  
  456.     move.l    #256-(24*5)/2,d2
  457.     move.l    #256-(32*5)/2+32,d3
  458.     lea.l    (draw_menu_先手,pc),a1
  459.     bsr    draw_string
  460.  
  461.     move.l    #256-(24*5)/2+24*2+12,d2
  462.     move.l    #256-(32*5)/2+32,d3
  463.     lea.l    (draw_menu_後手,pc),a1
  464.     bsr    draw_string
  465.  
  466.     move.l    #256-(24*5)/2,d2
  467.     move.l    #256-(32*5)/2+32*2,d3
  468.     lea.l    (draw_menu_レベル,pc),a1
  469.     bsr    draw_string
  470.  
  471.     move.l    #256-(24*5)/2+24*5-NUMBER_WIDTH*5,d2
  472.     move.l    #256-(32*5)/2+32*3,d3
  473.     lea.l    (draw_menu_12345,pc),a1
  474.     bsr    draw_string
  475.  
  476.     move.l    #256-(24*5)/2,d2
  477.     move.l    #256-(32*5)/2+32*4,d3
  478.     lea.l    (draw_menu_終了,pc),a1
  479.     bsr    draw_string
  480.  
  481.     movea.l    d1,a4
  482.  
  483.     moveq.l    #0,d0
  484.     bra    2f
  485. 1:    bsr    keyctrl_vwait
  486.     bsr    window0_palet
  487. 2:    addq.w    #1,d0
  488.     cmp.w    #31,d0
  489.     bls    1b
  490.  
  491. ;先手 後手
  492.     move.w    mode,d0
  493.     beq    5f
  494.     subq.w    #3,d0
  495.     beq    5f
  496.     move.l    #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
  497.     move.l    #((24*2-1)<<16)+(3-1),d2
  498.     moveq.l    #1,d0
  499.     and.w    mode,d0
  500.     beq    @f
  501.     add.l    #(24*2+12)<<16,d1
  502. @@:    bsr    draw_window_frame
  503. 5:
  504.  
  505. ;レベル
  506.     move.w    level,d0
  507.     move.l    #((256-(24*5)/2+24*5-NUMBER_WIDTH*5)<<16)+(256-(32*5)/2+32*3+32-3),d1
  508.     move.l    #((NUMBER_WIDTH-1)<<16)+(3-1),d2
  509.     subq.w    #1,d0
  510.     mulu.w    #NUMBER_WIDTH,d0
  511.     swap.w    d0
  512.     clr.w    d0
  513.     add.l    d0,d1
  514.     bsr    draw_window_frame
  515.  
  516. 10:    bsr    input_pos
  517.     movea.l    d0,a3
  518.     bmi    19f
  519.     cmp.l    #$FFFFFF00+$0D,d1
  520.     beq    111f            ;対局
  521.     cmp.l    #$FFFFFF00+' ',d1
  522.     beq    111f            ;対局
  523.     swap.w    d1
  524.     sub.w    #256-(24*5)/2,d1
  525.     bcs    10b
  526.     cmp.w    #24*5,d1
  527.     bcc    10b
  528.     swap.w    d1
  529.     sub.w    #256-(32*5)/2,d1
  530.     bcs    10b
  531.     lsr.w    #5,d1
  532.     cmp.w    #5,d1
  533.     bcc    10b
  534.     subq.w    #1,d1
  535.     bcs    11f            ;対局
  536.     beq    12f            ;先手 後手
  537.     subq.w    #2,d1
  538.     bcs    10b            ;レベル
  539.     beq    14f            ;12345
  540. ;終了
  541.     swap.w    d1
  542.     sub.w    #24*2,d1
  543.     bcc    10b
  544.     suba.l    a3,a3
  545.     bra    19f
  546.  
  547. ;対局
  548. 11:    swap.w    d1
  549.     sub.w    #24*2,d1
  550.     bcc    10b
  551. 111:    movea.w    #1,a3
  552.     bra    19f
  553.  
  554. ;先手 後手
  555. 12:    swap.w    d1
  556.     sub.w    #24*2,d1
  557.     bcs    1f
  558.     sub.w    #12,d1
  559.     bcs    10b
  560.     sub.w    #24*2,d1
  561.     bcc    10b
  562. ;後手
  563.     cmpi.w    #1,mode
  564.     beq    10b
  565.  
  566.     move.w    mode,d0
  567.     beq    5f
  568.     subq.w    #3,d0
  569.     beq    5f
  570.     move.l    #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
  571.     move.l    #((24*2-1)<<16)+(3-1),d2
  572.     moveq.l    #1,d0
  573.     and.w    mode,d0
  574.     beq    @f
  575.     add.l    #(24*2+12)<<16,d1
  576. @@:    bsr    erase_window_frame
  577. 5:
  578.  
  579.     move.w    #1,mode            ;0=man-man,1=com-man,2=man-com,3=com-com
  580.  
  581.     move.l    #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
  582.     move.l    #((24*2-1)<<16)+(3-1),d2
  583.     moveq.l    #1,d0
  584.     and.w    mode,d0
  585.     beq    @f
  586.     add.l    #(24*2+12)<<16,d1
  587. @@:    bsr    draw_window_frame
  588.  
  589.     bra    10b
  590. ;先手
  591. 1:    cmpi.w    #2,mode
  592.     beq    10b
  593.  
  594.     move.w    mode,d0
  595.     beq    5f
  596.     subq.w    #3,d0
  597.     beq    5f
  598.     move.l    #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
  599.     move.l    #((24*2-1)<<16)+(3-1),d2
  600.     moveq.l    #1,d0
  601.     and.w    mode,d0
  602.     beq    @f
  603.     add.l    #(24*2+12)<<16,d1
  604. @@:    bsr    erase_window_frame
  605. 5:
  606.  
  607.     move.w    #2,mode            ;0=man-man,1=com-man,2=man-com,3=com-com
  608.  
  609.     move.l    #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
  610.     move.l    #((24*2-1)<<16)+(3-1),d2
  611.     moveq.l    #1,d0
  612.     and.w    mode,d0
  613.     beq    @f
  614.     add.l    #(24*2+12)<<16,d1
  615. @@:    bsr    draw_window_frame
  616.  
  617.     bra    10b
  618.  
  619. ;レベル
  620. 13:    bra    10b
  621.  
  622. ;12345
  623. 14:    swap.w    d1
  624.     sub.w    #24*5-NUMBER_WIDTH*5,d1
  625.     bcs    10b
  626.     ext.l    d1
  627.     divu.w    #NUMBER_WIDTH,d1
  628.     addq.w    #1,d1
  629.  
  630.     cmp.w    level,d1
  631.     beq    10b
  632.  
  633.     move.w    level,d0
  634.     move.w    d1,level        ;1~5
  635.  
  636.     move.l    #((256-(24*5)/2+24*5-NUMBER_WIDTH*5)<<16)+(256-(32*5)/2+32*3+32-3),d1
  637.     move.l    #((NUMBER_WIDTH-1)<<16)+(3-1),d2
  638.     subq.w    #1,d0
  639.     mulu.w    #NUMBER_WIDTH,d0
  640.     swap.w    d0
  641.     clr.w    d0
  642.     add.l    d0,d1
  643.     bsr    erase_window_frame
  644.  
  645.     move.w    level,d0
  646.     move.l    #((256-(24*5)/2+24*5-NUMBER_WIDTH*5)<<16)+(256-(32*5)/2+32*3+32-3),d1
  647.     move.l    #((NUMBER_WIDTH-1)<<16)+(3-1),d2
  648.     subq.w    #1,d0
  649.     mulu.w    #NUMBER_WIDTH,d0
  650.     swap.w    d0
  651.     clr.w    d0
  652.     add.l    d0,d1
  653.     bsr    draw_window_frame
  654.  
  655.     bra    10b
  656.  
  657. 19:
  658.  
  659. ;先手 後手
  660.     move.w    mode,d0
  661.     beq    5f
  662.     subq.w    #3,d0
  663.     beq    5f
  664.     move.l    #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
  665.     move.l    #((24*2-1)<<16)+(3-1),d2
  666.     moveq.l    #1,d0
  667.     and.w    mode,d0
  668.     beq    @f
  669.     add.l    #(24*2+12)<<16,d1
  670. @@:    bsr    erase_window_frame
  671. 5:
  672.  
  673. ;レベル
  674.     move.w    level,d0
  675.     move.l    #((256-(24*5)/2+24*5-NUMBER_WIDTH*5)<<16)+(256-(32*5)/2+32*3+32-3),d1
  676.     move.l    #((NUMBER_WIDTH-1)<<16)+(3-1),d2
  677.     subq.w    #1,d0
  678.     mulu.w    #NUMBER_WIDTH,d0
  679.     swap.w    d0
  680.     clr.w    d0
  681.     add.l    d0,d1
  682.     bsr    erase_window_frame
  683.  
  684.     moveq.l    #30,d0
  685. @@:    bsr    keyctrl_vwait
  686.     bsr    window0_palet
  687.     dbra    d0,@b
  688.  
  689.     move.l    #MOJI_SPRITE,d1
  690.     move.l    a4,d0
  691.     sub.l    d1,d0
  692.     bsr    erase_string
  693.  
  694.     move.l    #((256-(8+24*5+8)/2)<<16)+(256-(9+32*5+9)/2),d1
  695.     move.l    #(((8+24*5+8)-1)<<16)+((9+32*5+9)-1),d2
  696.     bsr    close_window
  697.  
  698.     bsr    user
  699.     move.l    a3,d0
  700.     movem.l    (sp)+,d0-d3/a1/a3-a4
  701.     rts
  702.  
  703. ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  704.     .align    4,$2048
  705. draw_menu_対局:
  706.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_対
  707.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_局
  708.     .dc.l    -1
  709. draw_menu_先手:
  710.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_先
  711.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_手
  712.     .dc.l    -1
  713. draw_menu_後手:
  714.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_後
  715.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_手
  716.     .dc.l    -1
  717. draw_menu_レベル:
  718.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_レ
  719.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_ベ
  720.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_ル
  721.     .dc.l    -1
  722. draw_menu_12345:
  723.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_1
  724.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_2
  725.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_3
  726.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_4
  727.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_5
  728.     .dc.l    -1
  729. draw_menu_終了:
  730.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_終
  731.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_了
  732.     .dc.l    -1
  733.  
  734. ;----------------------------------------------------------------
  735. ;ウィンドウの中に枠を表示する
  736. ;<d1.l:(X始点<<16)+Y始点
  737. ;<d2.l:(X差分<<16)+Y差分
  738.     .text
  739.     .align    4,$2048
  740. draw_window_frame:
  741.     movem.l    d0/a1,-(sp)
  742.     lea.l    (-2*6,sp),sp
  743.     bsr    vwait
  744.     movea.l    sp,a1
  745.     move.w    #1,(a1)+
  746.     move.l    d1,(a1)+
  747.     move.l    d2,(a1)+
  748.     move.w    #$FFFF,(a1)+
  749.     movea.l    sp,a1
  750.     IOCS    _TXFILL
  751.     clr.w    (sp)
  752.     clr.w    (2*5,sp)
  753.     movea.l    sp,a1
  754.     IOCS    _TXFILL
  755.     lea.l    (2*6,sp),sp
  756.     movem.l    (sp)+,d0/a1
  757.     rts
  758.  
  759. ;----------------------------------------------------------------
  760. ;ウィンドウの中の枠を消す
  761. ;<d1.l:(X始点<<16)+Y始点
  762. ;<d2.l:(X差分<<16)+Y差分
  763.     .text
  764.     .align    4,$2048
  765. erase_window_frame:
  766.     movem.l    d0/a1,-(sp)
  767.     lea.l    (-2*6,sp),sp
  768.     bsr    vwait
  769.     movea.l    sp,a1
  770.     clr.w    (a1)+
  771.     move.l    d1,(a1)+
  772.     move.l    d2,(a1)+
  773.     move.w    #$FFFF,(a1)+
  774.     movea.l    sp,a1
  775.     IOCS    _TXFILL
  776.     move.w    #1,(sp)
  777.     clr.w    (2*5,sp)
  778.     movea.l    sp,a1
  779.     IOCS    _TXFILL
  780.     lea.l    (2*6,sp),sp
  781.     movem.l    (sp)+,d0/a1
  782.     rts
  783.  
  784. ;----------------------------------------------------------------
  785. ;パスを表示して少し待つ
  786. ;<d6.b:自分の石
  787. ;<d7.b:相手の石
  788.     .text
  789.     .align    4,$2048
  790. draw_pass::
  791.     movem.l    d1-d3/a1,-(sp)
  792.     bsr    super
  793.  
  794.     move.l    #((256-(8+24+12+24+24+8)/2)<<16)+(256-16-9),d1
  795.     move.l    #((8+24+12+24+24+8-1)<<16)+(9+32+9-1),d2
  796.     bsr    open_window
  797.  
  798.     moveq.l    #0,d0
  799.     bsr    window0_palet
  800.  
  801.     move.l    #MOJI_SPRITE,d1
  802.     move.l    #256-(24+12+24+24)/2,d2
  803.     move.l    #256-16,d3
  804.  
  805.     move.l    #-1,-(sp)
  806.     cmp.b    #B,d6
  807.     bne    1f
  808.     move.l    #WINDOW0_PALETTE*256+MOJI_PATTERN_黒,-(sp)
  809.     bra    2f
  810. 1:    move.l    #WINDOW0_PALETTE*256+MOJI_PATTERN_白,-(sp)
  811. 2:    movea.l    sp,a1
  812.     bsr    draw_string
  813.     addq.l    #8,sp
  814.  
  815.     add.w    #12,d2
  816.  
  817.     lea.l    (draw_pass_string,pc),a1
  818.     bsr    draw_string
  819.  
  820.     moveq.l    #0,d0
  821.     bra    2f
  822. 1:    bsr    keyctrl_vwait
  823.     bsr    window0_palet
  824. 2:    addq.w    #1,d0
  825.     cmp.w    #31,d0
  826.     bls    1b
  827.  
  828.     move.w    #PASS_WAIT-1,d0
  829. @@:    bsr    vwait
  830.     dbra    d0,@b
  831.  
  832.     moveq.l    #30,d0
  833. @@:    bsr    keyctrl_vwait
  834.     bsr    window0_palet
  835.     dbra    d0,@b
  836.  
  837.     move.l    d1,d0
  838.     move.l    #MOJI_SPRITE,d1
  839.     sub.l    d1,d0
  840.     bsr    erase_string
  841.  
  842.     move.l    #((256-(8+24+12+24+24+8)/2)<<16)+(256-16-9),d1
  843.     move.l    #((8+24+12+24+24+8-1)<<16)+(9+32+9-1),d2
  844.     bsr    close_window
  845.  
  846.     bsr    user
  847.     movem.l    (sp)+,d1-d3/a1
  848.     rts
  849.  
  850. ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  851.     .align    4,$2048
  852. draw_pass_string:
  853.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_パ
  854.     .dc.l    WINDOW0_PALETTE*256+MOJI_PATTERN_ス
  855.     .dc.l    -1
  856.  
  857. ;----------------------------------------------------------------
  858. ;文字ウィンドウを開く
  859. ;    必ず始点<終点であること
  860. ;    画面内に収まる位置を指定すること
  861. ;    パレットは固定
  862. ;<d1.l:(X始点<<16)+Y始点
  863. ;<d2.l:(X差分<<16)+Y差分
  864.     .text
  865.     .align    4,$2048
  866. open_window:
  867.     movem.l    d0-d3/a1,-(sp)
  868.     bsr    super
  869.     lea.l    (-2*6,sp),sp
  870.     movea.l    sp,a1
  871.     clr.w    (a1)+
  872.     move.l    d1,(a1)+
  873.     move.l    d2,(a1)+
  874.     move.w    #$00FF,(a1)+
  875.     move.l    d2,d3
  876.     swap.w    d3            ;X差分
  877.     cmp.w    d2,d3
  878.     blo    @f            ;縦長
  879.     move.w    d2,d3            ;横長または正方形
  880. @@:
  881. ;<d3.w:短い辺の差分
  882.     subq.w    #1,d3
  883.     lsr.w    #1,d3
  884.     lea.l    (2,sp),a1
  885.     add.w    d3,(a1)+
  886.     add.w    d3,(a1)+
  887.     move.w    d3,d0
  888.     add.w    d0,d0
  889.     sub.w    d0,(a1)+
  890.     sub.w    d0,(a1)+
  891. 3:    bsr    keyctrl_vwait
  892.     movea.l    sp,a1
  893.     IOCS    _TXBOX
  894.     lea.l    (2,sp),a1
  895.     subq.w    #1,(a1)+
  896.     subq.w    #1,(a1)+
  897.     addq.w    #1+1,(a1)+
  898.     addq.w    #1+1,(a1)+
  899.     dbra    d3,3b
  900.     movea.l    sp,a1
  901.     move.w    #1,(a1)+
  902.     addq.w    #3,(a1)+
  903.     addq.w    #4,(a1)+
  904.     subq.w    #3+3,(a1)+
  905.     subq.w    #4+4,(a1)+
  906.     movea.l    sp,a1
  907.     IOCS    _TXBOX
  908.     lea.l    (2*6,sp),sp
  909.     bsr    user
  910.     movem.l    (sp)+,d0-d3/a1
  911.     rts
  912.  
  913. ;----------------------------------------------------------------
  914. ;文字ウィンドウを閉じる
  915. ;    必ず始点<終点であること
  916. ;    画面内に収まる位置を指定すること
  917. ;    パレットは固定
  918. ;<d1.l:(X始点<<16)+Y始点
  919. ;<d2.l:(X差分<<16)+Y差分
  920.     .text
  921.     .align    4,$2048
  922. close_window:
  923.     movem.l    d0-d3/a1,-(sp)
  924.     bsr    super
  925.     lea.l    (-2*6,sp),sp
  926.     movea.l    sp,a1
  927.     addq.l    #2,a1
  928.     move.l    d1,(a1)+
  929.     move.l    d2,(a1)+
  930.     clr.w    (a1)+
  931.     move.l    d2,d3
  932.     swap.w    d3            ;X差分
  933.     cmp.w    d2,d3
  934.     blo    @f            ;縦長
  935.     move.w    d2,d3            ;横長または正方形
  936. @@:
  937. ;<d3.w:短い辺の差分
  938.     subq.w    #1,d3
  939.     lsr.w    #1,d3
  940. 3:    bsr    keyctrl_vwait
  941.     movea.l    sp,a1            ;$8003で済ませたいところだがROM1.0が対応していない
  942.     clr.w    (a1)
  943.     IOCS    _TXBOX
  944.     movea.l    sp,a1
  945.     move.w    #1,(a1)
  946.     IOCS    _TXBOX
  947.     lea.l    (2,sp),a1
  948.     addq.w    #1,(a1)+
  949.     addq.w    #1,(a1)+
  950.     subq.w    #1+1,(a1)+
  951.     subq.w    #1+1,(a1)+
  952.     dbra    d3,3b
  953.     lea.l    (2*6,sp),sp
  954.     bsr    user
  955.     movem.l    (sp)+,d0-d3/a1
  956.     rts
  957.  
  958. ;----------------------------------------------------------------
  959. ;ウィンドウに文字列を表示する
  960. ;<d1.l:先頭のスプライト番号
  961. ;<d2.l:X座標
  962. ;<d3.l:Y座標
  963. ;<a1.l:文字列の情報の先頭
  964. ;    .dc.l    (パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev)
  965. ;            :
  966. ;    .dc.l    -1
  967. ;>d1.l:次のスプライト番号
  968. ;>d2.l:次のX座標
  969. ;>d3.l:次のY座標
  970.     .text
  971.     .align    4,$2048
  972. draw_string:
  973.     movem.l    d0/d4-d5/a1,-(sp)
  974.     bset.l    #31,d1
  975.     moveq.l    #16,d0
  976.     add.l    d0,d2
  977.     add.l    d0,d3
  978.     move.l    #3,d5
  979.     bra    2f
  980. 1:
  981. ;<d1.l:スプライト番号,bit31=nowait
  982. ;<d2.l:X座標+16
  983. ;<d3.l:Y座標+16
  984. ;<d4.l:パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  985. ;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
  986.   .if NUMBER_WIDTH<24
  987.     cmp.b    #NUMBER_PATTERN,d4
  988.     blo    @f
  989.     cmp.b    #NUMBER_PATTERN+4*10,d4
  990.     bcc    @f
  991.     subq.w    #(24-NUMBER_WIDTH)/2,d2    ;数字のときは幅を補正する
  992. @@:
  993.   .endif
  994.     movem.l    d1-d5,-(sp)
  995.     IOCS    _SP_REGST
  996.     movem.l    (sp)+,d1-d5
  997.     addq.b    #1,d1            ;スプライト番号
  998.     add.w    #16,d2            ;X座標
  999.     addq.b    #1,d4            ;パターン番号
  1000.     movem.l    d1-d5,-(sp)
  1001.     IOCS    _SP_REGST
  1002.     movem.l    (sp)+,d1-d5
  1003.     addq.b    #1,d1            ;スプライト番号
  1004.     sub.w    #16,d2            ;X座標
  1005.     add.w    #16,d3            ;Y座標
  1006.     addq.b    #1,d4            ;パターン番号
  1007.     movem.l    d1-d5,-(sp)
  1008.     IOCS    _SP_REGST
  1009.     movem.l    (sp)+,d1-d5
  1010.     addq.b    #1,d1            ;スプライト番号
  1011.     add.w    #16,d2            ;X座標
  1012.     addq.b    #1,d4            ;パターン番号
  1013.     movem.l    d1-d5,-(sp)
  1014.     IOCS    _SP_REGST
  1015.     movem.l    (sp)+,d1-d5
  1016.   .if NUMBER_WIDTH<24
  1017.     cmp.b    #NUMBER_PATTERN,d4
  1018.     blo    @f
  1019.     cmp.b    #NUMBER_PATTERN+4*10,d4
  1020.     bcc    @f
  1021.     subq.w    #(24-NUMBER_WIDTH)-(24-NUMBER_WIDTH)/2,d2    ;数字のときは幅を補正する
  1022. @@:
  1023.   .endif
  1024.     addq.b    #1,d1            ;スプライト番号
  1025.     add.w    #8,d2            ;X座標
  1026.     sub.w    #16,d3            ;Y座標
  1027. ;    addq.b    #1,d4            ;パターン番号
  1028. 2:
  1029.     move.l    (a1)+,d4        ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1030.     bpl    1b
  1031.     bclr.l    #31,d1
  1032.     moveq.l    #16,d0
  1033.     sub.l    d0,d2
  1034.     sub.l    d0,d3
  1035.     movem.l    (sp)+,d0/d4-d5/a1
  1036.     rts
  1037.  
  1038. ;----------------------------------------------------------------
  1039. ;ウィンドウに表示した文字列を消去する
  1040. ;<d0.l:消去するスプライト数
  1041. ;<d1.l:先頭のスプライト番号
  1042. ;>d1.l:次のスプライト番号
  1043.     .text
  1044.     .align    4,$2048
  1045. erase_string:
  1046.     movem.l    d0/d2-d5,-(sp)
  1047.     bset.l    #31,d1
  1048.     move.w    d0,-(sp)
  1049. @@:    move.l    d1,-(sp)
  1050.     move.l    #0,d2
  1051.     move.l    #0,d3
  1052.     move.l    #0,d4
  1053.     move.l    #0,d5
  1054.     IOCS    _SP_REGST
  1055.     move.l    (sp)+,d1
  1056.     addq.b    #1,d1
  1057.     subq.w    #1,(sp)
  1058.     bne    @b
  1059.     addq.l    #2,sp
  1060.     bclr.l    #31,d1
  1061.     movem.l    (sp)+,d0/d2-d5
  1062.     rts
  1063.  
  1064. ;----------------------------------------------------------------
  1065. ;ウィンドウ0の文字のレベルを設定する
  1066. ;<d0.l:レベル(0~31)
  1067.     .text
  1068.     .align    4,$2048
  1069. window0_palet:
  1070.     movem.l    d0-d6,-(sp)
  1071.     move.l    d0,d5
  1072.     lsl.w    #5,d5
  1073.     or.w    d0,d5
  1074.     lsl.w    #6,d5
  1075.     or.w    #$003E,d5
  1076.     move.l    #$0840_1080,d6
  1077.     moveq.l    #16-1,d4
  1078. 4:    move.l    #$80000000,d1        ;パレットブロック×16+パレットコード,bit31=nowait
  1079.     move.w    d4,d1
  1080.     move.l    #WINDOW0_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1081.     move.l    d5,d3            ;カラーコード
  1082.     IOCS    _SPALET
  1083.     swap.w    d6
  1084.     sub.w    d6,d5
  1085.     dbcs    d4,4b
  1086.     bcc    9f
  1087. 4:    move.l    #$80000000,d1        ;パレットブロック×16+パレットコード,bit31=nowait
  1088.     move.w    d4,d1
  1089.     move.l    #WINDOW0_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1090.     move.l    #(31<<1),d3        ;カラーコード
  1091.     IOCS    _SPALET
  1092.     dbra    d4,4b
  1093. 9:    movem.l    (sp)+,d0-d6
  1094.     rts
  1095.  
  1096. ;----------------------------------------------------------------
  1097. ;ウィンドウ1の文字のレベルを設定する
  1098. ;<d0.l:レベル(0~31)
  1099.     .text
  1100.     .align    4,$2048
  1101. window1_palet:
  1102.     movem.l    d0-d6,-(sp)
  1103.     move.l    d0,d5
  1104.     lsl.w    #5,d5
  1105.     or.w    d0,d5
  1106.     lsl.w    #6,d5
  1107.     or.w    #$003E,d5
  1108.     move.l    #$0840_1080,d6
  1109.     moveq.l    #16-1,d4
  1110. 4:    move.l    #$80000000,d1        ;パレットブロック×16+パレットコード,bit31=nowait
  1111.     move.w    d4,d1
  1112.     move.l    #WINDOW1_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1113.     move.l    d5,d3            ;カラーコード
  1114.     IOCS    _SPALET
  1115.     swap.w    d6
  1116.     sub.w    d6,d5
  1117.     dbcs    d4,4b
  1118.     bcc    9f
  1119. 4:    move.l    #$80000000,d1        ;パレットブロック×16+パレットコード,bit31=nowait
  1120.     move.w    d4,d1
  1121.     move.l    #WINDOW1_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1122.     move.l    #(31<<1),d3        ;カラーコード
  1123.     IOCS    _SPALET
  1124.     dbra    d4,4b
  1125. 9:    movem.l    (sp)+,d0-d6
  1126.     rts
  1127.  
  1128. ;----------------------------------------------------------------
  1129. ;黒の石の数を表示する
  1130.     .text
  1131.     .align    4,$2048
  1132. draw_black_count::
  1133.     movem.l    d0-d5,-(sp)
  1134.     move.l    black_count,d0
  1135.     cmp.l    #32<<16,d0
  1136.     bcc    9f
  1137.     move.l    #COUNTER_SPRITE,d1
  1138.     move.l    #BLACK_COUNT_X,d2
  1139.     move.l    #BLACK_COUNT_Y,d3
  1140.     move.l    #NUMBER_PALETTE,d4
  1141.     move.l    #1,d5
  1142.     bsr    drawnum2
  1143. 9:    movem.l    (sp)+,d0-d5
  1144.     rts
  1145.  
  1146. ;----------------------------------------------------------------
  1147. ;白の石の数を表示する
  1148.     .text
  1149.     .align    4,$2048
  1150. draw_white_count::
  1151.     movem.l    d0-d5,-(sp)
  1152.     move.l    white_count,d0
  1153.     cmp.l    #32<<16,d0
  1154.     bcc    9f
  1155.     move.l    #COUNTER_SPRITE+6*2,d1
  1156.     move.l    #WHITE_COUNT_X,d2
  1157.     move.l    #WHITE_COUNT_Y,d3
  1158.     move.l    #NUMBER_PALETTE,d4
  1159.     move.l    #1,d5
  1160.     bsr    drawnum2
  1161. 9:    movem.l    (sp)+,d0-d5
  1162.     rts
  1163.  
  1164. ;----------------------------------------------------------------
  1165. ;置いた石を表示する
  1166. ;<a6.l:レコードの先頭
  1167. ;    0.w    ひっくり返した石の数
  1168. ;    2.l    置いた位置(アドレス,置く前は空いていた)
  1169. ;    6.b    置いた石
  1170. ;    7.b    ひっくり返した石
  1171. ;    8.w    ひっくり返した石の位置(置いた位置からのオフセット)
  1172. ;     :
  1173. ;>a6.l:レコードの末尾
  1174. ;?d0-d2/a0
  1175.     .text
  1176.     .align    4,$2048
  1177. tup_draw::
  1178.     movem.l    d0-d4/a0,-(sp)
  1179.     bsr    super
  1180.     move.w    (a6)+,d3        ;ひっくり返した石の数
  1181.     move.l    (a6)+,d2        ;置いた位置
  1182.     sub.l    #ban,d2
  1183.     move.l    d2,d0
  1184.     divu.w    #9,d0
  1185.     subq.w    #1,d0            ;y
  1186.     lsl.w    #3,d0
  1187.     move.w    d0,d1
  1188.     clr.w    d0
  1189.     swap.w    d0
  1190.     subq.w    #1,d0            ;x
  1191.     add.w    d1,d0
  1192.     move.w    (a6)+,d1        ;下位バイト=ひっくり返した石
  1193.     subq.b    #B,d1
  1194.     beq    10f            ;ひっくり返した石が黒=置いた石は白
  1195. ;置いた石は黒
  1196.     move.l    d0,d4
  1197.     moveq.l    #0,d1
  1198.     bsr    standbypat1
  1199.     moveq.l    #1,d1
  1200. 1:    move.l    d4,d0
  1201.     bsr    blendpat1
  1202.     addq.w    #1,black_count
  1203.     bsr    draw_black_count
  1204.     addq.w    #1,d1
  1205.     cmp.w    #33,d1
  1206.     blo    1b
  1207.     clr.w    black_count
  1208.     addq.w    #1,black_count+2
  1209.     bsr    draw_black_count
  1210.  
  1211.     subq.w    #1,d3
  1212. 3:    movea.l    d2,a0
  1213.     adda.w    (a6)+,a0
  1214.     move.l    a0,d0
  1215.     divu.w    #9,d0
  1216.     subq.w    #1,d0            ;y
  1217.     lsl.w    #3,d0
  1218.     move.w    d0,d1
  1219.     clr.w    d0
  1220.     swap.w    d0
  1221.     subq.w    #1,d0            ;x
  1222.     add.w    d1,d0
  1223.     moveq.l    #0,d1
  1224.     bsr    animpat1
  1225.     dbra    d3,3b
  1226.     bra    99f
  1227.  
  1228. ;置いた石は白
  1229. 10:
  1230.     move.l    d0,d4
  1231.     moveq.l    #36,d1
  1232.     bsr    standbypat1
  1233.     moveq.l    #1,d1
  1234. 1:    move.l    d4,d0
  1235.     bsr    blendpat1
  1236.     addq.w    #1,white_count
  1237.     bsr    draw_white_count
  1238.     addq.w    #1,d1
  1239.     cmp.w    #33,d1
  1240.     blo    1b
  1241.     clr.w    white_count
  1242.     addq.w    #1,white_count+2
  1243.     bsr    draw_white_count
  1244.  
  1245.     subq.w    #1,d3
  1246. 3:    movea.l    d2,a0
  1247.     adda.w    (a6)+,a0
  1248.     move.l    a0,d0
  1249.     divu.w    #9,d0
  1250.     subq.w    #1,d0            ;y
  1251.     lsl.w    #3,d0
  1252.     move.w    d0,d1
  1253.     clr.w    d0
  1254.     swap.w    d0
  1255.     subq.w    #1,d0            ;x
  1256.     add.w    d1,d0
  1257.     moveq.l    #36,d1
  1258.     bsr    animpat1
  1259.     dbra    d3,3b
  1260. 99:    bsr    user
  1261.     movem.l    (sp)+,d0-d4/a0
  1262.     rts
  1263.  
  1264. ;----------------------------------------------------------------
  1265. ;画面の初期化
  1266.     .text
  1267.     .align    4,$2048
  1268. init_screen::
  1269.     movem.l    d1-d7/a0-a6,-(sp)
  1270.  
  1271.     move.l    #(14<<16)+3,-(sp)
  1272.     DOS    _CONCTRL
  1273.     addq.l    #4,sp
  1274.     moveq.l    #12,d1
  1275.     IOCS    _CRTMOD
  1276.     IOCS    _G_CLR_ON
  1277.  
  1278.     IOCS    _MS_INIT
  1279.     moveq.l    #0,d1
  1280.     moveq.l    #0,d2
  1281.     IOCS    _SKEY_MOD
  1282. ;    IOCS    _MS_CURON
  1283.  
  1284.     IOCS    _B_CUROFF
  1285.  
  1286. ;テキストパレットを設定
  1287.     bsr    super
  1288.     bsr    vwait
  1289.     lea.l    (text_palet,pc),a0
  1290.     lea.l    $00E82200,a1
  1291.     moveq.l    #16-1,d0
  1292. @@:    move.w    (a0)+,(a1)+
  1293.     dbra    d0,@b
  1294.     bsr    user
  1295.  
  1296.   .if 0
  1297. ;マウスカーソルを変更する
  1298.     moveq.l    #15,d1
  1299.     lea.l    (mouse_cursor,pc),a1
  1300.     IOCS    _MS_PATST
  1301.     moveq.l    #15,d1
  1302.     IOCS    _MS_SEL
  1303.   .endif
  1304.  
  1305. ;スプライトを初期化する
  1306.     IOCS    _SP_INIT
  1307.     IOCS    _SP_CGCLR
  1308.  
  1309. ;プライオリティを設定する
  1310. ;          SP TX GR G3 G2 G1 G0
  1311.     move.w    #%00_01_10_11_10_01_00,d1
  1312.     IOCS    _PRIORITY
  1313.  
  1314. ;マス目のマップを読み込む
  1315. ;    .ds.l    512    ;ファイルの先頭からラスタの先頭までのオフセット
  1316. ;    .dc.w    データ,次の区切り,…    ;次の区切り=-1でラスタ終わり
  1317. ;        :
  1318.     clr.w    -(sp)
  1319.     pea.l    board_map_nam
  1320.     bsr    open_file
  1321.     addq.l    #6,sp
  1322.     tst.l    d0
  1323.     bmi    90f
  1324.     move.l    #32768,-(sp)
  1325.     pea.l    board_map
  1326.     move.w    d0,-(sp)
  1327.     DOS    _READ
  1328.     move.l    d0,(6,sp)
  1329.     DOS    _CLOSE
  1330.     lea.l    (10,sp),sp
  1331. ;マス目のマップをリロケートしておく
  1332.     lea.l    board_map,a0
  1333.     move.l    a0,d1
  1334.     move.w    #512-1,d0
  1335. @@:    add.l    d1,(a0)+
  1336.     dbra    d0,@b
  1337.  
  1338.     bsr    init_patbuf
  1339.  
  1340. ;スプライトパターンを定義する
  1341.     move.l    #NULL_PATTERN,d1    ;パターン番号
  1342.     move.l    #1,d2            ;0=8×8,1=16×16
  1343.     lea.l    (sp_null,pc),a1        ;パターンデータ
  1344.     IOCS    _SP_DEFCG
  1345.  
  1346.     move.l    #MASK_PATTERN,d1    ;パターン番号
  1347.     move.l    #1,d2            ;0=8×8,1=16×16
  1348.     lea.l    (sp_mask0,pc),a1    ;パターンデータ
  1349.     IOCS    _SP_DEFCG
  1350.     move.l    #MASK_PATTERN+1,d1    ;パターン番号
  1351.     move.l    #1,d2            ;0=8×8,1=16×16
  1352.     lea.l    (sp_mask1,pc),a1    ;パターンデータ
  1353.     IOCS    _SP_DEFCG
  1354.  
  1355.     move.l    #CURSOR_PATTERN,d1    ;パターン番号
  1356.     move.l    #1,d2            ;0=8×8,1=16×16
  1357.     lea.l    (sp_cursor,pc),a1    ;パターンデータ
  1358.     IOCS    _SP_DEFCG
  1359.  
  1360.     move.l    #TURN_PATTERN,d1    ;パターン番号
  1361.     move.l    #1,d2            ;0=8×8,1=16×16
  1362.     lea.l    (sp_turn,pc),a1        ;パターンデータ
  1363.     IOCS    _SP_DEFCG
  1364.  
  1365. n = 0
  1366.   .irp moji,0,1,2,3,4,5,6,7,8,9
  1367. MOJI_PATTERN_&moji    equ    NUMBER_PATTERN+4*n
  1368. m = 0
  1369.     .rept 4
  1370.     move.l    #MOJI_PATTERN_&moji+m,d1    ;パターン番号
  1371.     move.l    #1,d2            ;0=8×8,1=16×16
  1372.     lea.l    (spc&moji+128*m,pc),a1    ;パターンデータ
  1373.     IOCS    _SP_DEFCG
  1374. m = m+1
  1375.     .endm
  1376. n = n+1
  1377.   .endm
  1378.  
  1379. n = 0
  1380.   .irp moji,き,け,ち,の,ス,パ,ベ,ル,レ,引,局,後,黒,手,終,勝,石,先,対,白,分,了
  1381. MOJI_PATTERN_&moji    equ    MOJI_PATTERN+4*n
  1382. m = 0
  1383.     .rept 4
  1384.     move.l    #MOJI_PATTERN_&moji+m,d1    ;パターン番号
  1385.     move.l    #1,d2            ;0=8×8,1=16×16
  1386.     lea.l    (spc&moji+128*m,pc),a1    ;パターンデータ
  1387.     IOCS    _SP_DEFCG
  1388. m = m+1
  1389.     .endm
  1390. n = n+1
  1391.   .endm
  1392.  
  1393. ;スプライトのパレットを設定する
  1394.     lea.l    (text_palet,pc),a0
  1395.     move.l    #$80000000,d4
  1396. 4:    move.l    d4,d1            ;パレットブロック×16+パレットコード,bit31=nowait
  1397.     move.l    #MASK_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1398.     moveq.l    #0,d3            ;カラーコード
  1399.     move.w    (a0)+,d3
  1400.     cmp.w    #15,d4
  1401.     bne    @f
  1402.     moveq.l    #0,d3
  1403. @@:    IOCS    _SPALET
  1404.     addq.w    #1,d4
  1405.     cmp.w    #16,d4
  1406.     blo    4b
  1407.  
  1408.     lea.l    (cursor_palet,pc),a0
  1409.     move.l    #$80000000,d4
  1410. 4:    move.l    d4,d1            ;パレットブロック×16+パレットコード,bit31=nowait
  1411.     move.l    #CURSOR_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1412.     moveq.l    #0,d3            ;カラーコード
  1413.     move.w    (a0)+,d3
  1414.     IOCS    _SPALET
  1415.     addq.w    #1,d4
  1416.     cmp.w    #16,d4
  1417.     blo    4b
  1418.  
  1419. n = 0
  1420.   .rept 16
  1421.     move.l    #$80000000+n,d1        ;パレットブロック×16+パレットコード,bit31=nowait
  1422.     move.l    #NUMBER_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1423.     .if n
  1424.     move.l    #((8+n+n/2)<<11)+((8+n+n/2)<<6)+((8+n+n/2)<<1),d3    ;カラーコード
  1425.     .else
  1426.     move.l    #0,d3
  1427.     .endif
  1428.     IOCS    _SPALET
  1429. n = n+1
  1430.   .endm
  1431.  
  1432. n = 0
  1433.   .rept 16
  1434.     move.l    #$80000000+n,d1        ;パレットブロック×16+パレットコード,bit31=nowait
  1435.     move.l    #WINDOW0_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1436.     .if n
  1437.     move.l    #((8+n+n/2)<<11)+((8+n+n/2)<<6)+(31<<1),d3    ;カラーコード
  1438.     .else
  1439.     move.l    #(31<<1),d3
  1440.     .endif
  1441.     IOCS    _SPALET
  1442. n = n+1
  1443.   .endm
  1444.  
  1445. n = 0
  1446.   .rept 16
  1447.     move.l    #$80000000+n,d1        ;パレットブロック×16+パレットコード,bit31=nowait
  1448.     move.l    #WINDOW1_PALETTE,d2    ;パレットブロック(0ならd1の上位4bitを使う)
  1449.     .if n
  1450.     move.l    #((8+n+n/2)<<11)+((8+n+n/2)<<6)+(31<<1),d3    ;カラーコード
  1451.     .else
  1452.     move.l    #(31<<1),d3
  1453.     .endif
  1454.     IOCS    _SPALET
  1455. n = n+1
  1456.   .endm
  1457.  
  1458. ;バックグラウンドを表示する
  1459.     move.l    #BG_PAGE,d1        ;BGページ番号
  1460.     move.l    #BG_TEXT,d2        ;BGテキスト番号
  1461.     move.l    #1,d3            ;0=OFF,1=ON
  1462.     IOCS    _BGCTRLST
  1463.  
  1464. ;バックグラウンドの位置を設定する
  1465.     move.l    #BG_PAGE,d1        ;BGページ番号
  1466.     move.l    #0,d2            ;X方向スクロール
  1467.     move.l    #0,d3            ;Y方向スクロール
  1468.     IOCS    _BGSCRLST
  1469.  
  1470. ;バックグラウンドをパターンで塗り潰す
  1471.     move.l    #BG_TEXT,d1        ;BGテキスト番号
  1472.     move.l    #MASK_PALETTE*256+NULL_PATTERN,d2    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1473.     IOCS    _BGTEXTCL
  1474.  
  1475. ;バックグラウンドのパターンを繰り抜く
  1476.   .irp y,(-2),(-1),2,3
  1477.     .irp x,0,1,2
  1478.     move.l    #BG_TEXT,d1        ;BGテキスト番号
  1479.     move.l    #MOJI_BLACK_X+2+x,d2    ;X座標
  1480.     move.l    #MOJI_BLACK_Y+y,d3    ;Y座標
  1481.       .if y=(-2).or.y=(3)
  1482.     move.l    #MASK_PALETTE*256+MASK_PATTERN,d4    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1483.       .elseif y=(-1)
  1484.     move.l    #MASK_PALETTE*256+MASK_PATTERN+1,d4    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1485.       .else
  1486.     move.l    #$8000+MASK_PALETTE*256+MASK_PATTERN+1,d4    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1487.       .endif
  1488.     IOCS    _BGTEXTST
  1489.     .endm
  1490.   .endm
  1491.   .irp y,(-2),(-1),2,3
  1492.     .irp x,0,1,2
  1493.     move.l    #BG_TEXT,d1        ;BGテキスト番号
  1494.     move.l    #MOJI_WHITE_X+2+x,d2    ;X座標
  1495.     move.l    #MOJI_WHITE_Y+y,d3    ;Y座標
  1496.       .if y=(-2).or.y=(3)
  1497.     move.l    #MASK_PALETTE*256+MASK_PATTERN,d4    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1498.       .elseif y=(-1)
  1499.     move.l    #MASK_PALETTE*256+MASK_PATTERN+1,d4    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1500.       .else
  1501.     move.l    #$8000+MASK_PALETTE*256+MASK_PATTERN+1,d4    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1502.       .endif
  1503.     IOCS    _BGTEXTST
  1504.     .endm
  1505.   .endm
  1506.  
  1507. ;黒と白の文字を表示
  1508.   .irp y,0,1
  1509.     .irp x,0,1
  1510.     move.l    #BG_TEXT,d1        ;BGテキスト番号
  1511.     move.l    #MOJI_BLACK_X+x,d2    ;X座標
  1512.     move.l    #MOJI_BLACK_Y+y,d3    ;Y座標
  1513.     move.l    #BLACK_PALETTE*256+MOJI_PATTERN_黒+x+2*y,d4    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1514.     IOCS    _BGTEXTST
  1515.     .endm
  1516.   .endm
  1517.   .irp y,0,1
  1518.     .irp x,0,1
  1519.     move.l    #BG_TEXT,d1        ;BGテキスト番号
  1520.     move.l    #MOJI_WHITE_X+x,d2    ;X座標
  1521.     move.l    #MOJI_WHITE_Y+y,d3    ;Y座標
  1522.     move.l    #WHITE_PALETTE*256+MOJI_PATTERN_白+x+2*y,d4    ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1523.     IOCS    _BGTEXTST
  1524.     .endm
  1525.   .endm
  1526.  
  1527. ;スプライトのマウスカーソルを割り込み駆動にする
  1528.     bsr    super
  1529.     bsr    vwait
  1530.     lea.l    $00EB0000+8*CURSOR_SPRITE,a0
  1531.     move.l    #0,(a0)+        ;X座標,Y座標
  1532.   .if 1
  1533.     move.w    #CURSOR_PALETTE*256+CURSOR_PATTERN,(a0)+
  1534.             ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1535.   .else
  1536.     move.w    #NUMBER_PALETTE*256+CURSOR_PATTERN,(a0)+
  1537.             ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1538.   .endif
  1539.     move.w    #3,(a0)+        ;0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
  1540.     move.l    $09B6.w,mouse_interrupt_old_vector
  1541.     move.l    #mouse_interrupt_routine,$09B6.w
  1542.     bsr    user
  1543.  
  1544. ;石数のウィンドウを開く
  1545.     move.l    #((16*MOJI_BLACK_X-8)<<16)+(16*MOJI_BLACK_Y-9),d1
  1546.     move.l    #((8+(512-16*MOJI_BLACK_X*2)+8-1)<<16)+(9+32+9),d2
  1547.     bsr    open_window
  1548.  
  1549. ;スプライト表示開始
  1550.     IOCS    _SP_ON
  1551.  
  1552. 98:    moveq.l    #0,d0
  1553. 99:    movem.l    (sp)+,d1-d7/a0-a6
  1554.     rts
  1555.  
  1556. 90:    moveq.l    #-1,d0
  1557.     bra    99b
  1558.  
  1559. ;テキストパレット
  1560.     .even
  1561. text_palet:
  1562.     .dc.w    %00000_00000_00000_0
  1563.     .dc.w    %00000_00000_11111_0
  1564.     .dc.w    %00000_11111_00000_0
  1565.     .dc.w    %11111_11111_11111_0
  1566.   .rept 4
  1567.     .dc.w    %11011_11001_10110_0
  1568.   .endm
  1569.   .rept 8
  1570.     .dc.w    %01000_00000_10001_0
  1571.   .endm
  1572.  
  1573. ;マウスカーソルのパレット
  1574.     .even
  1575. cursor_palet:
  1576.     grb    0,0,0
  1577.     grb    2,26,18
  1578.     grb    3,24,19
  1579.     grb    4,22,20
  1580.     grb    5,20,21
  1581.     grb    6,18,22
  1582.     grb    7,16,23
  1583.     grb    8,14,24
  1584.     grb    9,12,25
  1585.     grb    10,10,26
  1586.     grb    11,8,27
  1587.     grb    12,6,28
  1588.     grb    13,4,29
  1589.     grb    14,2,30
  1590.     grb    15,0,31
  1591.     grb    31,29,25
  1592.  
  1593.   .if 0
  1594. ;マウスカーソル
  1595.     .even
  1596. mouse_cursor:
  1597.     .dc.w    0,0            ;ホットスポット
  1598.  
  1599.     .dc.w    %0011111111111111
  1600.     .dc.w    %0001111111111111
  1601.     .dc.w    %0000111111111111
  1602.     .dc.w    %0000011111111111
  1603.     .dc.w    %0000001111111111
  1604.     .dc.w    %0000000111111111
  1605.     .dc.w    %0000000011111111
  1606.     .dc.w    %0000000001111111
  1607.     .dc.w    %0000000000111111
  1608.     .dc.w    %0000000000011111
  1609.     .dc.w    %0000000111111111
  1610.     .dc.w    %0001000011111111
  1611.     .dc.w    %0011000011111111
  1612.     .dc.w    %1111100001111111
  1613.     .dc.w    %1111100001111111
  1614.     .dc.w    %1111110011111111
  1615.  
  1616.     .dc.w    %0000000000000000
  1617.     .dc.w    %0100000000000000
  1618.     .dc.w    %0110000000000000
  1619.     .dc.w    %0111000000000000
  1620.     .dc.w    %0111100000000000
  1621.     .dc.w    %0111110000000000
  1622.     .dc.w    %0111111000000000
  1623.     .dc.w    %0111111100000000
  1624.     .dc.w    %0111111110000000
  1625.     .dc.w    %0111110000000000
  1626.     .dc.w    %0110110000000000
  1627.     .dc.w    %0100011000000000
  1628.     .dc.w    %0000011000000000
  1629.     .dc.w    %0000001100000000
  1630.     .dc.w    %0000001100000000
  1631.     .dc.w    %0000000000000000
  1632.   .endif
  1633.  
  1634. ;スプライトパターン
  1635.     .align    4,$2048
  1636.  
  1637. sp_null:
  1638.   .rept 32
  1639.     .dc.l    $00000000
  1640.   .endm
  1641.  
  1642. sp_mask0:
  1643.   .rept 32
  1644.     .dc.l    $FFFFFFFF
  1645.   .endm
  1646.  
  1647. sp_mask1:
  1648.     .dc.l    $FFFFFFFF
  1649.     .dc.l    $FFFFFFFF
  1650.     .dc.l    $FFFFFFFF
  1651.     .dc.l    $FFFFFFFF
  1652.     .dc.l    $FFFFFFFF
  1653.     .dc.l    $FFFFFFFF
  1654.     .dc.l    $FFFFFFFF
  1655.     .dc.l    $11111111
  1656.     .dc.l    $11111111
  1657.     .dc.l    $11111111
  1658.     .dc.l    $33333333
  1659.     .dc.l    $11111111
  1660.     .dc.l    $11111111
  1661.     .dc.l    $11111111
  1662.     .dc.l    $11111111
  1663.     .dc.l    $11111111
  1664.  
  1665.     .dc.l    $FFFFFFFF
  1666.     .dc.l    $FFFFFFFF
  1667.     .dc.l    $FFFFFFFF
  1668.     .dc.l    $FFFFFFFF
  1669.     .dc.l    $FFFFFFFF
  1670.     .dc.l    $FFFFFFFF
  1671.     .dc.l    $FFFFFFFF
  1672.     .dc.l    $11111111
  1673.     .dc.l    $11111111
  1674.     .dc.l    $11111111
  1675.     .dc.l    $33333333
  1676.     .dc.l    $11111111
  1677.     .dc.l    $11111111
  1678.     .dc.l    $11111111
  1679.     .dc.l    $11111111
  1680.     .dc.l    $11111111
  1681.  
  1682. sp_cursor:
  1683.   .if 1
  1684.     .dc.l    $FF000000
  1685.     .dc.l    $F1F00000
  1686.     .dc.l    $F11F0000
  1687.     .dc.l    $F222F000
  1688.     .dc.l    $F2333F00
  1689.     .dc.l    $F33444F0
  1690.     .dc.l    $F444555F
  1691.     .dc.l    $F4555666
  1692.     .dc.l    $F5566677
  1693.     .dc.l    $F66677FF
  1694.     .dc.l    $F67F78F0
  1695.     .dc.l    $F7F0F89F
  1696.     .dc.l    $FF00F99F
  1697.     .dc.l    $00000FAA
  1698.     .dc.l    $00000FBB
  1699.     .dc.l    $000000FF
  1700.  
  1701.     .dc.l    $00000000
  1702.     .dc.l    $00000000
  1703.     .dc.l    $00000000
  1704.     .dc.l    $00000000
  1705.     .dc.l    $00000000
  1706.     .dc.l    $00000000
  1707.     .dc.l    $00000000
  1708.     .dc.l    $F0000000
  1709.     .dc.l    $7F000000
  1710.     .dc.l    $FFF00000
  1711.     .dc.l    $00000000
  1712.     .dc.l    $00000000
  1713.     .dc.l    $00000000
  1714.     .dc.l    $F0000000
  1715.     .dc.l    $F0000000
  1716.     .dc.l    $00000000
  1717.   .elseif 1
  1718. ;パレットブロック0で普通のテキストのマウスカーソルと同じになるパターン
  1719.     .dc.l    $44000000
  1720.     .dc.l    $4C400000
  1721.     .dc.l    $4CC40000
  1722.     .dc.l    $4CCC4000
  1723.     .dc.l    $4CCCC400
  1724.     .dc.l    $4CCCCC40
  1725.     .dc.l    $4CCCCCC4
  1726.     .dc.l    $4CCCCCCC
  1727.     .dc.l    $4CCCCCCC
  1728.     .dc.l    $4CCCCC44
  1729.     .dc.l    $4CC4CC40
  1730.     .dc.l    $4C404CC4
  1731.     .dc.l    $44004CC4
  1732.     .dc.l    $000004CC
  1733.     .dc.l    $000004CC
  1734.     .dc.l    $00000044
  1735.  
  1736.     .dc.l    $00000000
  1737.     .dc.l    $00000000
  1738.     .dc.l    $00000000
  1739.     .dc.l    $00000000
  1740.     .dc.l    $00000000
  1741.     .dc.l    $00000000
  1742.     .dc.l    $00000000
  1743.     .dc.l    $40000000
  1744.     .dc.l    $C4000000
  1745.     .dc.l    $44400000
  1746.     .dc.l    $00000000
  1747.     .dc.l    $00000000
  1748.     .dc.l    $00000000
  1749.     .dc.l    $40000000
  1750.     .dc.l    $40000000
  1751.     .dc.l    $00000000
  1752.   .endif
  1753.  
  1754. sp_turn:
  1755.     .dc.l    $22222222
  1756.     .dc.l    $22222222
  1757.     .dc.l    $00000000
  1758.     .dc.l    $00000000
  1759.     .dc.l    $00000000
  1760.     .dc.l    $00000000
  1761.     .dc.l    $00000000
  1762.     .dc.l    $00000000
  1763.     .dc.l    $00000000
  1764.     .dc.l    $00000000
  1765.     .dc.l    $00000000
  1766.     .dc.l    $00000000
  1767.     .dc.l    $00000000
  1768.     .dc.l    $00000000
  1769.     .dc.l    $00000000
  1770.     .dc.l    $00000000
  1771.  
  1772.     .dc.l    $22222222
  1773.     .dc.l    $22222222
  1774.     .dc.l    $00000000
  1775.     .dc.l    $00000000
  1776.     .dc.l    $00000000
  1777.     .dc.l    $00000000
  1778.     .dc.l    $00000000
  1779.     .dc.l    $00000000
  1780.     .dc.l    $00000000
  1781.     .dc.l    $00000000
  1782.     .dc.l    $00000000
  1783.     .dc.l    $00000000
  1784.     .dc.l    $00000000
  1785.     .dc.l    $00000000
  1786.     .dc.l    $00000000
  1787.     .dc.l    $00000000
  1788.  
  1789.   .irp moji,0,1,2,3,4,5,6,7,8,9
  1790. spc&moji:    .insert    sp/&moji.sp
  1791.   .endm
  1792.   .irp moji,き,け,ち,の,ス,パ,ベ,ル,レ,引,局,後,黒,手,終,勝,石,先,対,白,分,了
  1793. spc&moji:    .insert    sp/&moji.sp
  1794.   .endm
  1795.  
  1796. board_map_nam:    .dc.b    'GREVDATA/BOARD.MAP',0
  1797.  
  1798.     .data
  1799.     .align    4
  1800. mouse_interrupt_old_vector:    .dc.l    0
  1801.  
  1802.     .bss
  1803. ;ボードマップ
  1804. ;    .ds.l    512    ;ラスタの先頭
  1805. ;    .dc.w    データ,次の区切り,…    ;次の区切り=-1でラスタ終わり
  1806. ;        :
  1807.     .align    4
  1808. board_map:    .ds.b    32768
  1809.  
  1810. ;----------------------------------------------------------------
  1811. ;画面の後始末
  1812.     .text
  1813.     .align    4,$2048
  1814. tini_screen::
  1815.     movem.l    d1-d7/a0-a6,-(sp)
  1816.  
  1817. ;マウスの割り込み処理を元に戻す
  1818.     move.l    mouse_interrupt_old_vector,d0
  1819.     ble    @f
  1820.     bsr    super
  1821.     move.l    d0,$09B6.w
  1822.     bsr    user
  1823. @@:
  1824.  
  1825.     IOCS    _B_CURON
  1826.  
  1827.     IOCS    _MS_CUROF
  1828.     IOCS    _MS_INIT
  1829.     moveq.l    #-1,d1
  1830.     moveq.l    #0,d2
  1831.     IOCS    _SKEY_MOD
  1832.     moveq.l    #0,d0
  1833.  
  1834.     moveq.l    #16,d1
  1835.     IOCS    _CRTMOD
  1836.     move.l    #(14<<16)+0,-(sp)
  1837.     DOS    _CONCTRL
  1838.     addq.l    #4,sp
  1839.  
  1840.     moveq.l    #0,d0
  1841.     movem.l    (sp)+,d1-d7/a0-a6
  1842.     rts
  1843.  
  1844. ;----------------------------------------------------------------
  1845. ;マウス処理の割り込みルーチン
  1846.     .text
  1847.     .align    4,$2048
  1848. mouse_interrupt_routine:
  1849.     move.l    a0,-(sp)
  1850.     movea.l    mouse_interrupt_old_vector,a0
  1851.     jsr    (a0)
  1852.     movea.l    $0ACE.w,a0        ;マウスカーソルの座標
  1853.     adda.l    #((16-CURSOR_HOT_X)<<16)+(16-CURSOR_HOT_Y),a0    ;座標を補正する
  1854.     move.l    a0,$00EB0000+8*CURSOR_SPRITE    ;スプライトの座標
  1855.     movea.l    (sp)+,a0
  1856.     rts
  1857.  
  1858. ;----------------------------------------------------------------
  1859. ;2桁のカウンタを表示する
  1860. ;<d0.l:(d<<16)+N,N=0~99,d=0~31
  1861. ;<d1.l:スプライト番号の先頭(スプライトを12個使用する)
  1862. ;<d2.l:X座標
  1863. ;<d3.l:Y座標
  1864. ;<d4.l:パレットブロック
  1865. ;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
  1866.     .text
  1867.     .align    4,$2048
  1868. drawnum2:
  1869.     movem.l    d0-d5/d7,-(sp)
  1870.     move.l    d0,d7
  1871.     moveq.l    #-1,d0
  1872. @@:    sub.w    #10,d7
  1873.     dbcs    d0,@b
  1874.     not.l    d0            ;10の位
  1875.     add.w    #10,d7            ;1の位
  1876.     cmp.w    #9,d7
  1877.     blo    @f
  1878.     swap.w    d0
  1879.     swap.w    d7
  1880.     move.w    d7,d0
  1881.     swap.w    d0
  1882.     swap.w    d7
  1883. @@:    bsr    drawnum1s
  1884.     move.l    d7,d0
  1885.     addq.w    #6,d1            ;スプライト番号の先頭
  1886.     add.w    #NUMBER_WIDTH,d2    ;X座標
  1887.     bsr    drawnum1
  1888.     movem.l    (sp)+,d0-d5/d7
  1889.     rts
  1890.  
  1891. ;----------------------------------------------------------------
  1892. ;数字を1つ表示する
  1893. ;<d0.l:(d<<16)+N,N=0~9,d=0~31
  1894. ;<d1.l:スプライト番号の先頭(スプライトを6個使用する)
  1895. ;<d2.l:X座標
  1896. ;<d3.l:Y座標
  1897. ;<d4.l:パレットブロック
  1898. ;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
  1899.     .text
  1900.     .align    4,$2048
  1901. drawnum1:
  1902.     movem.l    d0-d5,-(sp)
  1903.     bset.l    #31,d1
  1904.     add.w    #16,d2
  1905.     add.w    #16,d3
  1906.     lsl.w    #8,d4
  1907.     add.b    d0,d0
  1908.     add.b    d0,d0
  1909.     add.b    #NUMBER_PATTERN,d0
  1910.     move.b    d0,d4
  1911.     swap.w    d0
  1912.     sub.w    d0,d3
  1913. ;<d0.w:d
  1914. ;<d1.l:スプライト番号,bit31=nowait
  1915. ;<d2.l:X座標+16
  1916. ;<d3.l:Y座標+16
  1917. ;<d4.l:パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  1918. ;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
  1919.     cmp.w    #16,d0
  1920.     bcc    10f
  1921.     movem.l    d0-d5,-(sp)
  1922.     IOCS    _SP_REGST
  1923.     movem.l    (sp)+,d0-d5
  1924.     addq.w    #1,d1
  1925.     add.w    #16,d2
  1926.     movem.l    d0-d5,-(sp)
  1927.     addq.b    #1,d4
  1928.     IOCS    _SP_REGST
  1929.     movem.l    (sp)+,d0-d5
  1930.     addq.w    #1,d1
  1931.     sub.w    #16,d2
  1932. 10:
  1933.     add.w    #16,d3
  1934.     addq.b    #2,d4
  1935.     movem.l    d0-d5,-(sp)
  1936.     IOCS    _SP_REGST
  1937.     movem.l    (sp)+,d0-d5
  1938.     addq.w    #1,d1
  1939.     add.w    #16,d2
  1940.     movem.l    d0-d5,-(sp)
  1941.     addq.b    #1,d4
  1942.     IOCS    _SP_REGST
  1943.     movem.l    (sp)+,d0-d5
  1944.     tst.w    d0
  1945.     beq    90f
  1946.     addq.w    #1,d1
  1947.     sub.w    #16,d2
  1948.     add.w    #16,d3
  1949.     addq.b    #2,d4
  1950.     cmp.b    #NUMBER_PATTERN+4*10,d4
  1951.     bcs    @f
  1952.     sub.b    #4*10,d4
  1953. @@:
  1954.     movem.l    d0-d5,-(sp)
  1955.     IOCS    _SP_REGST
  1956.     movem.l    (sp)+,d0-d5
  1957.     addq.w    #1,d1
  1958.     add.w    #16,d2
  1959.     movem.l    d0-d5,-(sp)
  1960.     addq.b    #1,d4
  1961.     IOCS    _SP_REGST
  1962.     movem.l    (sp)+,d0-d5
  1963.     cmp.w    #16,d0
  1964.     blo    99f
  1965.     beq    90f
  1966.     addq.w    #1,d1
  1967.     sub.w    #16,d2
  1968.     add.w    #16,d3
  1969.     addq.b    #2,d4
  1970.     cmp.b    #NUMBER_PATTERN+4*10,d4
  1971.     bcs    @f
  1972.     sub.b    #4*10,d4
  1973. @@:
  1974.     movem.l    d1-d5,-(sp)
  1975.     IOCS    _SP_REGST
  1976.     movem.l    (sp)+,d1-d5
  1977.     addq.w    #1,d1
  1978.     add.w    #16,d2
  1979.     addq.b    #1,d4
  1980.     IOCS    _SP_REGST
  1981. 99:
  1982.     movem.l    (sp)+,d0-d5
  1983.     rts
  1984.  
  1985. 90:
  1986.     addq.w    #1,d1
  1987.     move.l    #0,d2
  1988.     move.l    #0,d3
  1989.     move.l    #0,d4
  1990.     move.l    #0,d5
  1991.     move.l    d1,-(sp)
  1992.     IOCS    _SP_REGST
  1993.     move.l    (sp)+,d1
  1994.     addq.w    #1,d1
  1995.     move.l    #0,d2
  1996.     move.l    #0,d3
  1997.     move.l    #0,d4
  1998.     move.l    #0,d5
  1999.     IOCS    _SP_REGST
  2000.     bra    99b
  2001.  
  2002. ;----------------------------------------------------------------
  2003. ;数字を1つ表示する(0は空白になる)
  2004. ;<d0.l:(d<<16)+N,N=0~9,d=0~31
  2005. ;<d1.l:スプライト番号の先頭(スプライトを6個使用する)
  2006. ;<d2.l:X座標
  2007. ;<d3.l:Y座標
  2008. ;<d4.l:パレットブロック
  2009. ;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
  2010.     .text
  2011.     .align    4,$2048
  2012. drawnum1s:
  2013.     movem.l    d0-d5,-(sp)
  2014.     bset.l    #31,d1
  2015.     add.w    #16,d2
  2016.     add.w    #16,d3
  2017.     lsl.w    #8,d4
  2018.     add.b    d0,d0
  2019.     add.b    d0,d0
  2020.     add.b    #NUMBER_PATTERN,d0
  2021.     move.b    d0,d4
  2022.     swap.w    d0
  2023.     sub.w    d0,d3
  2024. ;<d0.w:d
  2025. ;<d1.l:スプライト番号,bit31=nowait
  2026. ;<d2.l:X座標+16
  2027. ;<d3.l:Y座標+16
  2028. ;<d4.l:パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  2029. ;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
  2030.     cmp.w    #16,d0
  2031.     bcc    10f
  2032.     movem.l    d0-d5,-(sp)
  2033.     cmp.b    #NUMBER_PATTERN+4,d4
  2034.     bcc    @f
  2035.     moveq.l    #0,d2
  2036.     moveq.l    #0,d3
  2037.     moveq.l    #0,d4
  2038.     moveq.l    #0,d5
  2039. @@:
  2040.     IOCS    _SP_REGST
  2041.     movem.l    (sp)+,d0-d5
  2042.     addq.w    #1,d1
  2043.     add.w    #16,d2
  2044.     movem.l    d0-d5,-(sp)
  2045.     addq.b    #1,d4
  2046.     cmp.b    #NUMBER_PATTERN+4,d4
  2047.     bcc    @f
  2048.     moveq.l    #0,d2
  2049.     moveq.l    #0,d3
  2050.     moveq.l    #0,d4
  2051.     moveq.l    #0,d5
  2052. @@:
  2053.     IOCS    _SP_REGST
  2054.     movem.l    (sp)+,d0-d5
  2055.     addq.w    #1,d1
  2056.     sub.w    #16,d2
  2057. 10:
  2058.     add.w    #16,d3
  2059.     addq.b    #2,d4
  2060.     movem.l    d0-d5,-(sp)
  2061.     cmp.b    #NUMBER_PATTERN+4,d4
  2062.     bcc    @f
  2063.     moveq.l    #0,d2
  2064.     moveq.l    #0,d3
  2065.     moveq.l    #0,d4
  2066.     moveq.l    #0,d5
  2067. @@:
  2068.     IOCS    _SP_REGST
  2069.     movem.l    (sp)+,d0-d5
  2070.     addq.w    #1,d1
  2071.     add.w    #16,d2
  2072.     movem.l    d0-d5,-(sp)
  2073.     addq.b    #1,d4
  2074.     cmp.b    #NUMBER_PATTERN+4,d4
  2075.     bcc    @f
  2076.     moveq.l    #0,d2
  2077.     moveq.l    #0,d3
  2078.     moveq.l    #0,d4
  2079.     moveq.l    #0,d5
  2080. @@:
  2081.     IOCS    _SP_REGST
  2082.     movem.l    (sp)+,d0-d5
  2083.     tst.w    d0
  2084.     beq    90f
  2085.     addq.w    #1,d1
  2086.     sub.w    #16,d2
  2087.     add.w    #16,d3
  2088.     addq.b    #2,d4
  2089.     cmp.b    #NUMBER_PATTERN+4*10,d4
  2090.     bcs    @f
  2091.     sub.b    #4*10,d4
  2092. @@:
  2093.     movem.l    d0-d5,-(sp)
  2094.     IOCS    _SP_REGST
  2095.     movem.l    (sp)+,d0-d5
  2096.     addq.w    #1,d1
  2097.     add.w    #16,d2
  2098.     movem.l    d0-d5,-(sp)
  2099.     addq.b    #1,d4
  2100.     IOCS    _SP_REGST
  2101.     movem.l    (sp)+,d0-d5
  2102.     cmp.w    #16,d0
  2103.     blo    99f
  2104.     beq    90f
  2105.     addq.w    #1,d1
  2106.     sub.w    #16,d2
  2107.     add.w    #16,d3
  2108.     addq.b    #2,d4
  2109.     cmp.b    #NUMBER_PATTERN+4*10,d4
  2110.     bcs    @f
  2111.     sub.b    #4*10,d4
  2112. @@:
  2113.     movem.l    d1-d5,-(sp)
  2114.     IOCS    _SP_REGST
  2115.     movem.l    (sp)+,d1-d5
  2116.     addq.w    #1,d1
  2117.     add.w    #16,d2
  2118.     addq.b    #1,d4
  2119.     IOCS    _SP_REGST
  2120. 99:
  2121.     movem.l    (sp)+,d0-d5
  2122.     rts
  2123.  
  2124. 90:
  2125.     addq.w    #1,d1
  2126.     move.l    #0,d2
  2127.     move.l    #0,d3
  2128.     move.l    #0,d4
  2129.     move.l    #0,d5
  2130.     move.l    d1,-(sp)
  2131.     IOCS    _SP_REGST
  2132.     move.l    (sp)+,d1
  2133.     addq.w    #1,d1
  2134.     move.l    #0,d2
  2135.     move.l    #0,d3
  2136.     move.l    #0,d4
  2137.     move.l    #0,d5
  2138.     IOCS    _SP_REGST
  2139.     bra    99b
  2140.  
  2141. ;----------------------------------------------------------------
  2142. ;ゲームの初期化
  2143.     .text
  2144.     .align    4,$2048
  2145. init_graph::
  2146.     movem.l    d1-d7/a0-a6,-(sp)
  2147.  
  2148.     clr.w    -(sp)
  2149.     pea.l    board_gl3_nam
  2150.     bsr    open_file
  2151.     addq.l    #6,sp
  2152.     tst.l    d0
  2153.     bmi    90f
  2154.     move.l    #2*512*512,-(sp)
  2155.     pea.l    $00C00000
  2156.     move.w    d0,-(sp)
  2157.     DOS    _READ
  2158.     move.l    d0,(6,sp)
  2159.     DOS    _CLOSE
  2160.     addq.l    #6,sp
  2161.     cmpi.l    #2*512*512,(sp)+
  2162.     bne    90f
  2163.  
  2164.     lea.l    board_stat_table,a0
  2165.     moveq.l    #-1,d0
  2166.     moveq.l    #64-1,d1
  2167. 1:    move.l    d0,(a0)+
  2168.     dbra    d1,1b
  2169.  
  2170.     clr.l    black_count
  2171.     clr.l    white_count
  2172.  
  2173. 98:    moveq.l    #0,d0
  2174. 99:    movem.l    (sp)+,d1-d7/a0-a6
  2175.     rts
  2176.  
  2177. 90:    moveq.l    #-1,d0
  2178.     bra    99b
  2179.  
  2180. board_gl3_nam:    .dc.b    'GREVDATA/BOARD.GL3',0
  2181.  
  2182.     .bss
  2183.     .align    4
  2184. black_count:    .ds.l    1
  2185. white_count:    .ds.l    1
  2186.  
  2187. ;----------------------------------------------------------------
  2188. ;0:32
  2189. ratio_0    .macro    dx,dy,tx,ty
  2190.     moveq.l    #0,dx            ;A×0
  2191.     lsl.l    #5,dy            ;B×32
  2192.     .endm
  2193.  
  2194. ;----------------------------------------------------------------
  2195. ;1:31
  2196. ratio_1    .macro    dx,dy,tx,ty
  2197.     move.l    dy,ty            ;B×1
  2198.     lsl.l    #5,dy            ;B×32
  2199.     sub.l    ty,dy            ;B×31
  2200.     .endm
  2201.  
  2202. ;----------------------------------------------------------------
  2203. ;2:30
  2204. ratio_2    .macro    dx,dy,tx,ty
  2205.     move.l    dy,ty            ;B×1
  2206.     lsl.l    #4,dy            ;B×16
  2207.     lsl.l    #1,dx            ;A×2
  2208.     sub.l    ty,dy            ;B×15
  2209.     lsl.l    #1,dy            ;B×30
  2210.     .endm
  2211.  
  2212. ;----------------------------------------------------------------
  2213. ;3:29
  2214. ratio_3    .macro    dx,dy,tx,ty
  2215.     move.l    dy,ty            ;B×1
  2216.     lsl.l    #3,dy            ;B×8
  2217.     move.l    dx,tx            ;A×1
  2218.     sub.l    ty,dy            ;B×7
  2219.     lsl.l    #1,dx            ;A×2
  2220.     lsl.l    #2,dy            ;B×28
  2221.     add.l    tx,dx            ;A×3
  2222.     add.l    ty,dy            ;B×29
  2223.     .endm
  2224.  
  2225. ;----------------------------------------------------------------
  2226. ;4:28
  2227. ratio_4    .macro    dx,dy,tx,ty
  2228.     move.l    dy,ty            ;B×1
  2229.     lsl.l    #3,dy            ;B×8
  2230.     lsl.l    #2,dx            ;A×4
  2231.     sub.l    ty,dy            ;B×7
  2232.     lsl.l    #2,dy            ;B×28
  2233.     .endm
  2234.  
  2235. ;----------------------------------------------------------------
  2236. ;5:27
  2237. ratio_5    .macro    dx,dy,tx,ty
  2238.     move.l    dy,ty            ;B×1
  2239.     lsl.l    #3,dy            ;B×8
  2240.     move.l    dx,tx            ;A×1
  2241.     sub.l    ty,dy            ;B×7
  2242.     lsl.l    #2,dx            ;A×4
  2243.     lsl.l    #2,dy            ;B×28
  2244.     add.l    tx,dx            ;A×5
  2245.     sub.l    ty,dy            ;B×27
  2246.     .endm
  2247.  
  2248. ;----------------------------------------------------------------
  2249. ;6:26
  2250. ratio_6    .macro    dx,dy,tx,ty
  2251.     move.l    dy,ty            ;B×1
  2252.     lsl.l    #1,dy            ;B×2
  2253.     move.l    dx,tx            ;A×1
  2254.     add.l    ty,dy            ;B×3
  2255.     lsl.l    #1,dx            ;A×2
  2256.     lsl.l    #2,dy            ;B×12
  2257.     add.l    tx,dx            ;A×3
  2258.     add.l    ty,dy            ;B×13
  2259.     lsl.l    #1,dx            ;A×6
  2260.     lsl.l    #1,dy            ;B×26
  2261.     .endm
  2262.  
  2263. ;----------------------------------------------------------------
  2264. ;7:25
  2265. ratio_7    .macro    dx,dy,tx,ty
  2266.     move.l    dy,ty            ;B×1
  2267.     lsl.l    #1,dy            ;B×2
  2268.     move.l    dx,tx            ;A×1
  2269.     add.l    ty,dy            ;B×3
  2270.     lsl.l    #3,dx            ;A×8
  2271.     lsl.l    #3,dy            ;B×24
  2272.     sub.l    tx,dx            ;A×7
  2273.     add.l    ty,dy            ;B×25
  2274.     .endm
  2275.  
  2276. ;----------------------------------------------------------------
  2277. ;8:24
  2278. ratio_8    .macro    dx,dy,tx,ty
  2279.     move.l    dy,ty            ;B×1
  2280.     lsl.l    #1,dy            ;B×2
  2281.     lsl.l    #3,dx            ;A×8
  2282.     add.l    ty,dy            ;B×3
  2283.     lsl.l    #3,dy            ;B×24
  2284.     .endm
  2285.  
  2286. ;----------------------------------------------------------------
  2287. ;9:23
  2288. ratio_9    .macro    dx,dy,tx,ty
  2289.     move.l    dy,ty            ;B×1
  2290.     lsl.l    #1,dy            ;B×2
  2291.     move.l    dx,tx            ;A×1
  2292.     add.l    ty,dy            ;B×3
  2293.     lsl.l    #3,dx            ;A×8
  2294.     lsl.l    #3,dy            ;B×24
  2295.     add.l    tx,dx            ;A×9
  2296.     sub.l    ty,dy            ;B×23
  2297.     .endm
  2298.  
  2299. ;----------------------------------------------------------------
  2300. ;10:22
  2301. ratio_10    .macro    dx,dy,tx,ty
  2302.     move.l    dy,ty            ;B×1
  2303.     lsl.l    #2,dy            ;B×4
  2304.     move.l    dx,tx            ;A×1
  2305.     add.l    ty,dy            ;B×5
  2306.     lsl.l    #2,dx            ;A×4
  2307.     lsl.l    #1,dy            ;B×10
  2308.     add.l    tx,dx            ;A×5
  2309.     add.l    ty,dy            ;B×11
  2310.     lsl.l    #1,dx            ;A×10
  2311.     lsl.l    #1,dy            ;B×22
  2312.     .endm
  2313.  
  2314. ;----------------------------------------------------------------
  2315. ;11:21
  2316. ratio_11    .macro    dx,dy,tx,ty
  2317.     move.l    dx,tx            ;A×1
  2318.     move.l    dy,ty            ;B×1
  2319.     lsl.l    #2,dx            ;A×4
  2320.     lsl.l    #2,dy            ;B×4
  2321.     add.l    tx,dx            ;A×5
  2322.     add.l    ty,dy            ;B×5
  2323.     lsl.l    #1,dx            ;A×10
  2324.     lsl.l    #2,dy            ;B×20
  2325.     add.l    tx,dx            ;A×11
  2326.     add.l    ty,dy            ;B×21
  2327.     .endm
  2328.  
  2329. ;----------------------------------------------------------------
  2330. ;12:20
  2331. ratio_12    .macro    dx,dy,tx,ty
  2332.     move.l    dx,tx            ;A×1
  2333.     move.l    dy,ty            ;B×1
  2334.     lsl.l    #1,dx            ;A×2
  2335.     lsl.l    #2,dy            ;B×4
  2336.     add.l    tx,dx            ;A×3
  2337.     add.l    ty,dy            ;B×5
  2338.     lsl.l    #2,dx            ;A×12
  2339.     lsl.l    #2,dy            ;B×20
  2340.     .endm
  2341.  
  2342. ;----------------------------------------------------------------
  2343. ;13:19
  2344. ratio_13    .macro    dx,dy,tx,ty
  2345.     move.l    dx,tx            ;A×1
  2346.     move.l    dy,ty            ;B×1
  2347.     lsl.l    #1,dx            ;A×2
  2348.     lsl.l    #3,dy            ;B×8
  2349.     add.l    tx,dx            ;A×3
  2350.     add.l    ty,dy            ;B×9
  2351.     lsl.l    #2,dx            ;A×12
  2352.     lsl.l    #1,dy            ;B×18
  2353.     add.l    tx,dx            ;A×13
  2354.     add.l    ty,dy            ;B×19
  2355.     .endm
  2356.  
  2357. ;----------------------------------------------------------------
  2358. ;14:18
  2359. ratio_14    .macro    dx,dy,tx,ty
  2360.     move.l    dx,tx            ;A×1
  2361.     move.l    dy,ty            ;B×1
  2362.     lsl.l    #3,dx            ;A×8
  2363.     lsl.l    #3,dy            ;B×8
  2364.     sub.l    tx,dx            ;A×7
  2365.     add.l    ty,dy            ;B×9
  2366.     lsl.l    #1,dx            ;A×14
  2367.     lsl.l    #1,dy            ;B×18
  2368.     .endm
  2369.  
  2370. ;----------------------------------------------------------------
  2371. ;15:17
  2372. ratio_15    .macro    dx,dy,tx,ty
  2373.     move.l    dx,tx            ;A×1
  2374.     move.l    dy,ty            ;B×1
  2375.     lsl.l    #4,dx            ;A×16
  2376.     lsl.l    #4,dy            ;B×16
  2377.     sub.l    tx,dx            ;A×15
  2378.     add.l    ty,dy            ;B×17
  2379.     .endm
  2380.  
  2381. ;----------------------------------------------------------------
  2382. ;16:16
  2383. ratio_16    .macro    dx,dy,tx,ty
  2384.     lsl.l    #4,dx            ;A×16
  2385.     lsl.l    #4,dy            ;B×16
  2386.     .endm
  2387.  
  2388. ;----------------------------------------------------------------
  2389. ;17:15
  2390. ratio_17    .macro    dx,dy,tx,ty
  2391.     move.l    dx,tx            ;A×1
  2392.     move.l    dy,ty            ;B×1
  2393.     lsl.l    #4,dx            ;A×16
  2394.     lsl.l    #4,dy            ;B×16
  2395.     add.l    tx,dx            ;A×17
  2396.     sub.l    ty,dy            ;B×15
  2397.     .endm
  2398.  
  2399. ;----------------------------------------------------------------
  2400. ;18:14
  2401. ratio_18    .macro    dx,dy,tx,ty
  2402.     move.l    dx,tx            ;A×1
  2403.     move.l    dy,ty            ;B×1
  2404.     lsl.l    #3,dx            ;A×8
  2405.     lsl.l    #3,dy            ;B×8
  2406.     add.l    tx,dx            ;A×9
  2407.     sub.l    ty,dy            ;B×7
  2408.     lsl.l    #1,dx            ;A×18
  2409.     lsl.l    #1,dy            ;B×14
  2410.     .endm
  2411.  
  2412. ;----------------------------------------------------------------
  2413. ;19:13
  2414. ratio_19    .macro    dx,dy,tx,ty
  2415.     move.l    dx,tx            ;A×1
  2416.     move.l    dy,ty            ;B×1
  2417.     lsl.l    #3,dx            ;A×8
  2418.     lsl.l    #1,dy            ;B×2
  2419.     add.l    tx,dx            ;A×9
  2420.     add.l    ty,dy            ;B×3
  2421.     lsl.l    #1,dx            ;A×18
  2422.     lsl.l    #2,dy            ;B×12
  2423.     add.l    tx,dx            ;A×19
  2424.     add.l    ty,dy            ;B×13
  2425.     .endm
  2426.  
  2427. ;----------------------------------------------------------------
  2428. ;20:12
  2429. ratio_20    .macro    dx,dy,tx,ty
  2430.     move.l    dx,tx            ;A×1
  2431.     move.l    dy,ty            ;B×1
  2432.     lsl.l    #2,dx            ;A×4
  2433.     lsl.l    #1,dy            ;B×2
  2434.     add.l    tx,dx            ;A×5
  2435.     add.l    ty,dy            ;B×3
  2436.     lsl.l    #2,dx            ;A×20
  2437.     lsl.l    #2,dy            ;B×12
  2438.     .endm
  2439.  
  2440. ;----------------------------------------------------------------
  2441. ;21:11
  2442. ratio_21    .macro    dx,dy,tx,ty
  2443.     move.l    dx,tx            ;A×1
  2444.     move.l    dy,ty            ;B×1
  2445.     lsl.l    #2,dx            ;A×4
  2446.     lsl.l    #2,dy            ;B×4
  2447.     add.l    tx,dx            ;A×5
  2448.     add.l    ty,dy            ;B×5
  2449.     lsl.l    #2,dx            ;A×20
  2450.     lsl.l    #1,dy            ;B×10
  2451.     add.l    tx,dx            ;A×21
  2452.     add.l    ty,dy            ;B×11
  2453.     .endm
  2454.  
  2455. ;----------------------------------------------------------------
  2456. ;22:10
  2457. ratio_22    .macro    dx,dy,tx,ty
  2458.     move.l    dx,tx            ;A×1
  2459.     lsl.l    #2,dx            ;A×4
  2460.     move.l    dy,ty            ;B×1
  2461.     add.l    tx,dx            ;A×5
  2462.     lsl.l    #2,dy            ;B×4
  2463.     lsl.l    #1,dx            ;A×10
  2464.     add.l    ty,dy            ;B×5
  2465.     add.l    tx,dx            ;A×11
  2466.     lsl.l    #1,dy            ;B×10
  2467.     lsl.l    #1,dx            ;A×22
  2468.     .endm
  2469.  
  2470. ;----------------------------------------------------------------
  2471. ;23:9
  2472. ratio_23    .macro    dx,dy,tx,ty
  2473.     move.l    dx,tx            ;A×1
  2474.     lsl.l    #1,dx            ;A×2
  2475.     move.l    dy,ty            ;B×1
  2476.     add.l    tx,dx            ;A×3
  2477.     lsl.l    #3,dy            ;B×8
  2478.     lsl.l    #3,dx            ;A×24
  2479.     add.l    ty,dy            ;B×9
  2480.     sub.l    tx,dx            ;A×23
  2481.     .endm
  2482.  
  2483. ;----------------------------------------------------------------
  2484. ;24:8
  2485. ratio_24    .macro    dx,dy,tx,ty
  2486.     move.l    dx,tx            ;A×1
  2487.     lsl.l    #1,dx            ;A×2
  2488.     lsl.l    #3,dy            ;B×8
  2489.     add.l    tx,dx            ;A×3
  2490.     lsl.l    #3,dx            ;A×24
  2491.     .endm
  2492.  
  2493. ;----------------------------------------------------------------
  2494. ;25:7
  2495. ratio_25    .macro    dx,dy,tx,ty
  2496.     move.l    dx,tx            ;A×1
  2497.     lsl.l    #1,dx            ;A×2
  2498.     move.l    dy,ty            ;B×1
  2499.     add.l    tx,dx            ;A×3
  2500.     lsl.l    #3,dy            ;B×8
  2501.     lsl.l    #3,dx            ;A×24
  2502.     sub.l    ty,dy            ;B×7
  2503.     add.l    tx,dx            ;A×25
  2504.     .endm
  2505.  
  2506. ;----------------------------------------------------------------
  2507. ;26:6
  2508. ratio_26    .macro    dx,dy,tx,ty
  2509.     move.l    dx,tx            ;A×1
  2510.     lsl.l    #1,dx            ;A×2
  2511.     move.l    dy,ty            ;B×1
  2512.     add.l    tx,dx            ;A×3
  2513.     lsl.l    #1,dy            ;B×2
  2514.     lsl.l    #2,dx            ;A×12
  2515.     add.l    ty,dy            ;B×3
  2516.     add.l    tx,dx            ;A×13
  2517.     lsl.l    #1,dy            ;B×6
  2518.     lsl.l    #1,dx            ;A×26
  2519.     .endm
  2520.  
  2521. ;----------------------------------------------------------------
  2522. ;27:5
  2523. ratio_27    .macro    dx,dy,tx,ty
  2524.     move.l    dx,tx            ;A×1
  2525.     lsl.l    #3,dx            ;A×8
  2526.     move.l    dy,ty            ;B×1
  2527.     sub.l    tx,dx            ;A×7
  2528.     lsl.l    #2,dy            ;B×4
  2529.     lsl.l    #2,dx            ;A×28
  2530.     add.l    ty,dy            ;B×5
  2531.     sub.l    tx,dx            ;A×27
  2532.     .endm
  2533.  
  2534. ;----------------------------------------------------------------
  2535. ;28:4
  2536. ratio_28    .macro    dx,dy,tx,ty
  2537.     move.l    dx,tx            ;A×1
  2538.     lsl.l    #3,dx            ;A×8
  2539.     lsl.l    #2,dy            ;B×4
  2540.     sub.l    tx,dx            ;A×7
  2541.     lsl.l    #2,dx            ;A×28
  2542.     .endm
  2543.  
  2544. ;----------------------------------------------------------------
  2545. ;29:3
  2546. ratio_29    .macro    dx,dy,tx,ty
  2547.     move.l    dx,tx            ;A×1
  2548.     lsl.l    #3,dx            ;A×8
  2549.     move.l    dy,ty            ;B×1
  2550.     sub.l    tx,dx            ;A×7
  2551.     lsl.l    #1,dy            ;B×2
  2552.     lsl.l    #2,dx            ;A×28
  2553.     add.l    ty,dy            ;B×3
  2554.     add.l    tx,dx            ;A×29
  2555.     .endm
  2556.  
  2557. ;----------------------------------------------------------------
  2558. ;30:2
  2559. ratio_30    .macro    dx,dy,tx,ty
  2560.     move.l    dx,tx            ;A×1
  2561.     lsl.l    #4,dx            ;A×16
  2562.     lsl.l    #1,dy            ;B×2
  2563.     sub.l    tx,dx            ;A×15
  2564.     lsl.l    #1,dx            ;A×30
  2565.     .endm
  2566.  
  2567. ;----------------------------------------------------------------
  2568. ;31:1
  2569. ratio_31    .macro    dx,dy,tx,ty
  2570.     move.l    dx,tx            ;A×1
  2571.     lsl.l    #5,dx            ;A×32
  2572.     sub.l    tx,dx            ;A×31
  2573.     .endm
  2574.  
  2575. ;----------------------------------------------------------------
  2576. ;32:0
  2577. ratio_32    .macro    dx,dy,tx,ty
  2578.     lsl.l    #5,dx            ;A×32
  2579.     moveq.l    #0,dy            ;B×0
  2580.     .endm
  2581.  
  2582. ;----------------------------------------------------------------
  2583. ;ブレンドパターン表示
  2584. ;    スーパーバイザモードで呼び出すこと
  2585. ;    パターンの幅は63ドット以内であること
  2586. ;    standbypat1を実行しておくこと
  2587. ;<d0.l:マスの番号
  2588. ;<d1.l:混合比(0~32)
  2589.     .text
  2590.     .align    4,$2048
  2591. blendpat1:
  2592.     movem.l    d1-d7/a0-a5,-(sp)
  2593.     lea.l    (blend_table,pc),a5
  2594.     add.w    d1,d1
  2595.     add.w    d1,d1
  2596.     movea.l    (a5,d1.w),a5        ;ブレンド表示ルーチンのアドレス
  2597.                     ;d0=マスの番号
  2598.     move.l    d0,d2            ;d2=マスの番号
  2599.     lea.l    board_stat_table,a0
  2600.     add.w    d0,d0
  2601.     add.w    d0,d0
  2602.     adda.l    d0,a0            ;a0=board_stat_table上のアドレス
  2603.     move.l    (a0),d1            ;d1=マスの現在のパターン番号
  2604.     bmi    90f            ;パターンが表示されていない
  2605.     lea.l    gram_save_area,a1
  2606.   .if GRAM_SAVE_SEPARATELY
  2607.     add.w    d0,d0
  2608.     add.w    d0,d0
  2609.     lsl.l    #8,d0            ;マスの番号×4096
  2610.     adda.l    d0,a1            ;a1=GRAMセーブエリアのアドレス
  2611.   .endif
  2612.     move.l    d2,d0            ;マスの番号
  2613.     bsr    load_pat
  2614.     bmi    90f
  2615.     movea.l    d0,a0            ;マスのパターンテーブルの先頭
  2616.     add.w    d1,d1
  2617.     add.w    d1,d1
  2618.     adda.l    (a0,d1.w),a0        ;パターンデータの先頭
  2619.  
  2620.     move.w    (a0)+,d0        ;ymin
  2621.     add.w    #$00C0<<6,d0
  2622.     swap.w    d0
  2623.     clr.w    d0
  2624.     lsr.l    #6,d0
  2625.     movea.l    d0,a2            ;a2=ラスタの左端のアドレス
  2626.     move.w    (a0)+,d1        ;ylen-1
  2627.     move.w    d1,d0
  2628.     add.w    d0,d0
  2629.     add.w    d0,d0
  2630.     lea.l    (4,a0,d0.w),a4        ;a4=パターンのアドレス
  2631.  
  2632.     move.l    #%0000010000000000_1000000000100000,d6
  2633.     move.l    #%0000011111000000_1111100000111110,d7
  2634.  
  2635.     jsr    (a5)
  2636.  
  2637.     moveq.l    #0,d0
  2638. 99:    movem.l    (sp)+,d1-d7/a0-a5
  2639.     rts
  2640.  
  2641. 90:    moveq.l    #-1,d0
  2642.     bra    99b
  2643.  
  2644.     .align    4,$2048
  2645. blend_table:
  2646.   .irp %n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
  2647.     .dc.l    blend_%n
  2648.   .endm
  2649.  
  2650. ;<d1.w:ylen-1
  2651. ;<d6.l:%0000010000000000_1000000000100000
  2652. ;<d7.l:%0000011111000000_1111100000111110
  2653. ;<a0.l:リージョンデータ(xmin(y),xlen(y)-1,…)の先頭
  2654. ;<a1.l:GRAMセーブエリアのアドレス
  2655. ;<a2.l:GRAMのラスタの先頭
  2656. ;<a4.l:パターンのアドレス
  2657.   .irp %n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
  2658.     .align    4,$2048
  2659. blend_%n:
  2660.     bsr    keyctrl_vwait
  2661. 1:    move.w    (a0)+,d0        ;xmin(y)
  2662.     add.w    d0,d0
  2663.     lea.l    (a2,d0.w),a3        ;a3=GRAM上のアドレス
  2664.     move.w    (a0)+,d0        ;xlen(y)-1
  2665. @@:
  2666.     move.w    (a4)+,d2        ;0000000000000000gggggrrrrrbbbbb0
  2667.     move.w    (a1)+,d3        ;0000000000000000gggggrrrrrbbbbb0
  2668.  
  2669.     move.w    d2,d4
  2670.     move.w    d3,d5
  2671.     swap    d2            ;gggggrrrrrbbbbb0_0000000000000000
  2672.     swap    d3            ;gggggrrrrrbbbbb0_0000000000000000
  2673.     move.w    d4,d2            ;gggggrrrrrbbbbb0_gggggrrrrrbbbbb0
  2674.     move.w    d5,d3            ;gggggrrrrrbbbbb0_gggggrrrrrbbbbb0
  2675.     and.l    d7,d2            ;00000rrrrr000000_ggggg00000bbbbb0
  2676.     and.l    d7,d3            ;00000rrrrr000000_ggggg00000bbbbb0
  2677.  
  2678.     ratio_%n    d2,d3,d4,d5    ;比率を設定する
  2679.  
  2680.     add.l    d3,d2            ;rrrrrrrrrr0ggggg_gggggbbbbbbbbbb0
  2681.     add.l    d6,d2
  2682.     lsr.l    #5,d2
  2683.     and.l    d7,d2            ;00000rrrrr000000_ggggg00000bbbbb0
  2684.     move.w    d2,d3
  2685.     swap    d2            ;ggggg00000bbbbb0_00000rrrrr000000
  2686.     or.w    d3,d2            ;ggggg00000bbbbb0_gggggrrrrrbbbbb0
  2687.  
  2688.     move.w    d2,(a3)+
  2689.  
  2690.     dbra    d0,@b
  2691.     lea.l    (1024,a2),a2        ;次のラスタへ
  2692.     dbra    d1,1b
  2693.  
  2694.     rts
  2695.   .endm
  2696.  
  2697.   .if 0
  2698. ;----------------------------------------------------------------
  2699. ;パターン消去
  2700. ;    スーパーバイザモードで呼び出すこと
  2701. ;    パターンの幅は63ドット以内であること
  2702. ;<d0.l:マスの番号
  2703.     .text
  2704.     .align    4,$2048
  2705. erasepat1:
  2706.     movem.l    d1-d2/a0-a3,-(sp)
  2707.                     ;d0=マスの番号
  2708.     move.l    d0,d2            ;d2=マスの番号
  2709.     lea.l    board_stat_table,a0
  2710.     add.w    d0,d0
  2711.     add.w    d0,d0
  2712.     adda.l    d0,a0            ;a0=board_stat_table上のアドレス
  2713.     move.l    (a0),d1            ;d1=マスの現在のパターン番号
  2714.     bmi    90f            ;パターンが表示されていない
  2715.     lea.l    gram_save_area,a1
  2716.   .if GRAM_SAVE_SEPARATELY
  2717.     add.w    d0,d0
  2718.     add.w    d0,d0
  2719.     lsl.l    #8,d0            ;マスの番号×4096
  2720.     adda.l    d0,a1            ;a0=GRAMセーブエリアのアドレス
  2721.   .endif
  2722.     move.l    d2,d0            ;マスの番号
  2723.     bsr    load_pat
  2724.     bmi    90f
  2725.     move.l    #-1,(a0)        ;board_stat_tableから消去
  2726.     movea.l    d0,a0            ;マスのパターンテーブルの先頭
  2727.     add.w    d1,d1
  2728.     add.w    d1,d1
  2729.     adda.l    (a0,d1.w),a0        ;パターンデータの先頭
  2730.  
  2731.     move.w    (a0)+,d0        ;ymin
  2732.     add.w    #$00C0<<6,d0
  2733.     swap.w    d0
  2734.     clr.w    d0
  2735.     lsr.l    #6,d0
  2736.     movea.l    d0,a2            ;a2=ラスタの左端のアドレス
  2737.     move.w    (a0)+,d1        ;ylen-1
  2738.     bsr    keyctrl_vwait
  2739. 1:    move.w    (a0)+,d0        ;xmin(y)
  2740.     add.w    d0,d0
  2741.     lea.l    (a2,d0.w),a3        ;GRAM上のX方向開始アドレス
  2742.     move.w    (a0)+,d0        ;xlen(y)-1
  2743.   .if 0
  2744. @@:    move.w    (a1)+,(a3)+        ;バッファ→GRAM
  2745.     dbra    d0,@b
  2746.   .else
  2747.                     ; 0  1  2  3  4
  2748.     neg.w    d0            ; 0 -1 -2 -3 -4
  2749.     add.w    d0,d0            ; 0 -2 -4 -6 -8
  2750.     jmp    (@f,pc,d0.w)
  2751.     .rept 63-1
  2752.     move.w    (a1)+,(a3)+        ;バッファ→GRAM
  2753.     .endm
  2754. @@:    move.w    (a1)+,(a3)+        ;バッファ→GRAM
  2755.   .endif
  2756.     lea.l    (1024,a2),a2        ;次のラスタへ
  2757.     dbra    d1,1b
  2758.  
  2759.     moveq.l    #0,d0
  2760. 99:    movem.l    (sp)+,d1-d2/a0-a3
  2761.     rts
  2762.  
  2763. 90:    moveq.l    #-1,d0
  2764.     bra    99b
  2765.   .endif
  2766.  
  2767. ;----------------------------------------------------------------
  2768. ;パターンアニメ
  2769. ;    スーパーバイザモードで呼び出すこと
  2770. ;    パターンの幅は63ドット以内であること
  2771. ;<d0.l:マスの番号
  2772. ;<d1.l:パターンの番号
  2773.     .text
  2774.     .align    4,$2048
  2775. animpat1:
  2776.     movem.l    d2-d3/a0,-(sp)
  2777.     move.l    d0,d2            ;d0=マスの番号
  2778.                     ;d2=マスの番号
  2779.     lea.l    board_stat_table,a0
  2780.     add.w    d0,d0
  2781.     add.w    d0,d0
  2782.     adda.l    d0,a0            ;a0=board_stat_table上のアドレス
  2783.     move.l    (a0),d0            ;d0=マスの現在のパターン番号
  2784.     bpl    @f
  2785. ;何も表示されていなかったときは1枚だけ表示する
  2786.     move.l    d2,d0            ;d0=マスの番号
  2787.     bsr    drawpat1
  2788.     bra    98f
  2789.  
  2790. ;既に表示されていたのでアニメーションを行う
  2791. @@:    cmp.l    d0,d1
  2792.     beq    98f
  2793.     blt    20f
  2794. ;黒→白
  2795.     tst.b    turn_com
  2796.     bne    10f
  2797. ;黒→白,人間の手番なので手前に向かって回転
  2798.     move.w    #32,black_count
  2799.     subq.w    #1,black_count+2
  2800.     moveq.l    #0,d3
  2801. 3:    move.l    d2,d0
  2802.     move.l    d3,d1
  2803.     bsr    drawpat1
  2804.     subq.w    #1,black_count
  2805.     addq.w    #1,white_count
  2806.     bsr    draw_black_count
  2807.     bsr    draw_white_count
  2808.     addq.w    #1,d3
  2809.     cmp.w    #36,d3
  2810.     bls    3b
  2811.     clr.w    black_count
  2812.     clr.w    white_count
  2813.     addq.w    #1,white_count+2
  2814.     bsr    draw_white_count
  2815.     bra    98f
  2816.  
  2817. ;黒→白,コンピュータの手番なので奥に向かって回転
  2818. 10:    move.w    #32,black_count
  2819.     subq.w    #1,black_count+2
  2820.     moveq.l    #71,d3
  2821. 3:    move.l    d2,d0
  2822.     move.l    d3,d1
  2823.     bsr    drawpat1
  2824.     subq.w    #1,black_count
  2825.     addq.w    #1,white_count
  2826.     bsr    draw_black_count
  2827.     bsr    draw_white_count
  2828.     subq.w    #1,d3
  2829.     cmp.w    #36,d3
  2830.     bhs    3b
  2831.     clr.w    black_count
  2832.     clr.w    white_count
  2833.     addq.w    #1,white_count+2
  2834.     bsr    draw_white_count
  2835.     bra    98f
  2836.  
  2837. ;白→黒
  2838. 20:    tst.b    turn_com
  2839.     bne    30f
  2840. ;白→黒,人間の手番なので手前に向かって回転
  2841.     move.w    #32,white_count
  2842.     subq.w    #1,white_count+2
  2843.     moveq.l    #37,d3
  2844. 3:    move.l    d2,d0
  2845.     move.l    d3,d1
  2846.     bsr    drawpat1
  2847.     addq.w    #1,black_count
  2848.     subq.w    #1,white_count
  2849.     bsr    draw_black_count
  2850.     bsr    draw_white_count
  2851.     addq.w    #1,d3
  2852.     cmp.w    #71,d3
  2853.     bls    3b
  2854.     move.l    d2,d0
  2855.     moveq.l    #0,d1
  2856.     bsr    drawpat1
  2857.     clr.w    black_count
  2858.     addq.w    #1,black_count+2
  2859.     clr.w    white_count
  2860.     bsr    draw_black_count
  2861.     bra    98f
  2862.  
  2863. ;白→黒,コンピュータの手番なので奥に向かって回転
  2864. 30:    move.w    #32,white_count
  2865.     subq.w    #1,white_count+2
  2866.     moveq.l    #35,d3
  2867. 3:    move.l    d2,d0
  2868.     move.l    d3,d1
  2869.     bsr    drawpat1
  2870.     addq.w    #1,black_count
  2871.     subq.w    #1,white_count
  2872.     bsr    draw_black_count
  2873.     bsr    draw_white_count
  2874.     subq.w    #1,d3
  2875.     bhs    3b
  2876.     clr.w    black_count
  2877.     addq.w    #1,black_count+2
  2878.     clr.w    white_count
  2879.     bsr    draw_black_count
  2880.     bra    98f
  2881.  
  2882. 98:    moveq.l    #0,d0
  2883. 99:    movem.l    (sp)+,d2-d3/a0
  2884.     rts
  2885.  
  2886. ;----------------------------------------------------------------
  2887. ;パターン表示準備(GRAMからバッファへのセーブだけ行い,GRAMへの書き込みは行わない)
  2888. ;    スーパーバイザモードで呼び出すこと
  2889. ;    パターンの幅は63ドット以内であること
  2890. ;<d0.l:マスの番号
  2891. ;<d1.l:パターンの番号
  2892.     .text
  2893.     .align    4,$2048
  2894. standbypat1:
  2895.     movem.l    d1-d2/a0-a4,-(sp)
  2896.                     ;d0=マスの番号
  2897.     move.l    d0,d2            ;d2=マスの番号
  2898.     lea.l    board_stat_table,a0
  2899.     add.w    d0,d0
  2900.     add.w    d0,d0
  2901.     adda.l    d0,a0            ;a0=board_stat_table上のアドレス
  2902.     lea.l    gram_save_area,a1
  2903.   .if GRAM_SAVE_SEPARATELY
  2904.     add.w    d0,d0
  2905.     add.w    d0,d0
  2906.     lsl.l    #8,d0            ;マスの番号×4096
  2907.     adda.l    d0,a1            ;a1=GRAMセーブエリアのアドレス
  2908.   .endif
  2909.  
  2910.   .if 0
  2911.     tst.l    (a0)
  2912.     bmi    10f            ;パターンが表示されていない
  2913.     cmp.l    (a0),d1
  2914.     beq    98f            ;指定されたパターンが既に表示されている
  2915.  
  2916.     movem.l    d0-d2/a0-a1,-(sp)
  2917.  
  2918.     move.l    (a0),d1            ;d1=マスの現在のパターン番号
  2919.  
  2920.     move.l    d2,d0            ;マスの番号
  2921.     bsr    load_pat
  2922.     bmi    95f
  2923.     movea.l    d0,a0            ;マスのパターンテーブルの先頭
  2924.     add.w    d1,d1
  2925.     add.w    d1,d1
  2926.     adda.l    (a0,d1.w),a0        ;パターンデータの先頭
  2927.  
  2928.     move.w    (a0)+,d0        ;ymin
  2929.     add.w    #$00C0<<6,d0
  2930.     swap.w    d0
  2931.     clr.w    d0
  2932.     lsr.l    #6,d0
  2933.     movea.l    d0,a2            ;a2=ラスタの左端のアドレス
  2934.     move.w    (a0)+,d1        ;ylen-1
  2935. 1:    move.w    (a0)+,d0        ;xmin(y)
  2936.     add.w    d0,d0
  2937.     lea.l    (a2,d0.w),a3        ;GRAM上のX方向開始アドレス
  2938.     move.w    (a0)+,d0        ;xlen(y)-1
  2939.   .if 0
  2940. @@:    move.w    (a1)+,(a3)+
  2941.     dbra    d0,@b
  2942.   .else
  2943.                     ; 0  1  2  3  4
  2944.     neg.w    d0            ; 0 -1 -2 -3 -4
  2945.     add.w    d0,d0            ; 0 -2 -4 -6 -8
  2946.     jmp    (@f,pc,d0.w)
  2947.     .rept 63-1
  2948.     move.w    (a1)+,(a3)+
  2949.     .endm
  2950. @@:    move.w    (a1)+,(a3)+
  2951.   .endif
  2952.     lea.l    (1024,a2),a2        ;次のラスタへ
  2953.     dbra    d1,1b
  2954.  
  2955.     movem.l    (sp)+,d0-d2/a0-a1
  2956.  
  2957. 10:
  2958.   .endif
  2959.     move.l    d1,(a0)            ;新しいパターンの番号
  2960.  
  2961.     move.l    d2,d0            ;マスの番号
  2962.     bsr    load_pat
  2963.     bmi    90f
  2964.     movea.l    d0,a0            ;マスのパターンテーブルの先頭
  2965.     add.w    d1,d1
  2966.     add.w    d1,d1
  2967.     adda.l    (a0,d1.w),a0        ;パターンデータの先頭
  2968.  
  2969.     move.w    (a0)+,d0        ;ymin
  2970.     add.w    #$00C0<<6,d0
  2971.     swap.w    d0
  2972.     clr.w    d0
  2973.     lsr.l    #6,d0
  2974.     movea.l    d0,a2            ;a2=ラスタの左端のアドレス
  2975.     move.w    (a0)+,d1        ;ylen-1
  2976.     move.w    d1,d0
  2977.     add.w    d0,d0
  2978.     add.w    d0,d0            ;リージョンデータの長さ-4
  2979.     lea.l    (4,a0,d0.w),a4        ;a4=色データの先頭
  2980. 1:    move.w    (a0)+,d0        ;xmin(y)
  2981.     add.w    d0,d0
  2982.     lea.l    (a2,d0.w),a3        ;GRAM上のX方向開始アドレス
  2983.     move.w    (a0)+,d0        ;xlen(y)-1
  2984.   .if 0
  2985. @@:    move.w    (a3)+,(a1)+
  2986.     dbra    d0,@b
  2987.   .else
  2988.                     ; 0  1  2  3  4
  2989.     neg.w    d0            ; 0 -1 -2 -3 -4
  2990.     add.w    d0,d0            ; 0 -2 -4 -6 -8
  2991.     jmp    (@f,pc,d0.w)
  2992.     .rept 63-1
  2993.     move.w    (a3)+,(a1)+        ;GRAM→バッファ
  2994.     .endm
  2995. @@:    move.w    (a3)+,(a1)+        ;GRAM→バッファ
  2996.   .endif
  2997.     lea.l    (1024,a2),a2        ;次のラスタへ
  2998.     dbra    d1,1b
  2999.  
  3000. 98:    moveq.l    #0,d0
  3001. 99:    movem.l    (sp)+,d1-d2/a0-a4
  3002.     rts
  3003.  
  3004. 95:    movem.l    (sp)+,d0-d2/a0-a1
  3005. 90:    moveq.l    #-1,d0
  3006.     bra    99b
  3007.  
  3008. ;----------------------------------------------------------------
  3009. ;パターン表示
  3010. ;    スーパーバイザモードで呼び出すこと
  3011. ;    パターンの幅は63ドット以内であること
  3012. ;<d0.l:マスの番号
  3013. ;<d1.l:パターンの番号
  3014.     .text
  3015.     .align    4,$2048
  3016. drawpat1:
  3017.     movem.l    d1-d2/d7/a0-a4,-(sp)
  3018.     moveq.l    #0,d7
  3019.                     ;d0=マスの番号
  3020.     move.l    d0,d2            ;d2=マスの番号
  3021.     lea.l    board_stat_table,a0
  3022.     add.w    d0,d0
  3023.     add.w    d0,d0
  3024.     adda.l    d0,a0            ;a0=board_stat_table上のアドレス
  3025.     lea.l    gram_save_area,a1
  3026.   .if GRAM_SAVE_SEPARATELY
  3027.     add.w    d0,d0
  3028.     add.w    d0,d0
  3029.     lsl.l    #8,d0            ;マスの番号×4096
  3030.     adda.l    d0,a1            ;a1=GRAMセーブエリアのアドレス
  3031.   .endif
  3032.  
  3033.     tst.l    (a0)
  3034.     bmi    10f            ;パターンが表示されていない
  3035.     cmp.l    (a0),d1
  3036.     beq    98f            ;指定されたパターンが既に表示されている
  3037.  
  3038.     movem.l    d0-d2/a0-a1,-(sp)
  3039.  
  3040.     move.l    (a0),d1            ;d1=マスの現在のパターン番号
  3041.  
  3042.     move.l    d2,d0            ;マスの番号
  3043.     bsr    load_pat
  3044.     bmi    95f
  3045.     movea.l    d0,a0            ;マスのパターンテーブルの先頭
  3046.     add.w    d1,d1
  3047.     add.w    d1,d1
  3048.     adda.l    (a0,d1.w),a0        ;パターンデータの先頭
  3049.  
  3050.     move.w    (a0)+,d0        ;ymin
  3051.     add.w    #$00C0<<6,d0
  3052.     swap.w    d0
  3053.     clr.w    d0
  3054.     lsr.l    #6,d0
  3055.     movea.l    d0,a2            ;a2=ラスタの左端のアドレス
  3056.     move.w    (a0)+,d1        ;ylen-1
  3057.     bsr    keyctrl_vwait
  3058.     st.b    d7
  3059. 1:    move.w    (a0)+,d0        ;xmin(y)
  3060.     add.w    d0,d0
  3061.     lea.l    (a2,d0.w),a3        ;GRAM上のX方向開始アドレス
  3062.     move.w    (a0)+,d0        ;xlen(y)-1
  3063.   .if 0
  3064. @@:    move.w    (a1)+,(a3)+
  3065.     dbra    d0,@b
  3066.   .else
  3067.                     ; 0  1  2  3  4
  3068.     neg.w    d0            ; 0 -1 -2 -3 -4
  3069.     add.w    d0,d0            ; 0 -2 -4 -6 -8
  3070.     jmp    (@f,pc,d0.w)
  3071.     .rept 63-1
  3072.     move.w    (a1)+,(a3)+
  3073.     .endm
  3074. @@:    move.w    (a1)+,(a3)+
  3075.   .endif
  3076.     lea.l    (1024,a2),a2        ;次のラスタへ
  3077.     dbra    d1,1b
  3078.  
  3079.     movem.l    (sp)+,d0-d2/a0-a1
  3080.  
  3081. 10:    move.l    d1,(a0)            ;新しいパターンの番号
  3082.  
  3083.     move.l    d2,d0            ;マスの番号
  3084.     bsr    load_pat
  3085.     bmi    90f
  3086.     movea.l    d0,a0            ;マスのパターンテーブルの先頭
  3087.     add.w    d1,d1
  3088.     add.w    d1,d1
  3089.     adda.l    (a0,d1.w),a0        ;パターンデータの先頭
  3090.  
  3091.     move.w    (a0)+,d0        ;ymin
  3092.     add.w    #$00C0<<6,d0
  3093.     swap.w    d0
  3094.     clr.w    d0
  3095.     lsr.l    #6,d0
  3096.     movea.l    d0,a2            ;a2=ラスタの左端のアドレス
  3097.     move.w    (a0)+,d1        ;ylen-1
  3098.     move.w    d1,d0
  3099.     add.w    d0,d0
  3100.     add.w    d0,d0            ;リージョンデータの長さ-4
  3101.     lea.l    (4,a0,d0.w),a4        ;a4=色データの先頭
  3102.     tst.b    d7
  3103.     bne    @f
  3104.     bsr    keyctrl_vwait
  3105. @@:
  3106. 1:    move.w    (a0)+,d0        ;xmin(y)
  3107.     add.w    d0,d0
  3108.     lea.l    (a2,d0.w),a3        ;GRAM上のX方向開始アドレス
  3109.     move.w    (a0)+,d0        ;xlen(y)-1
  3110. @@:    move.w    (a3),(a1)+        ;GRAM→バッファ
  3111.     move.w    (a4)+,(a3)+        ;パターン→GRAM
  3112.     dbra    d0,@b
  3113.     lea.l    (1024,a2),a2        ;次のラスタへ
  3114.     dbra    d1,1b
  3115.  
  3116. 98:    moveq.l    #0,d0
  3117. 99:    movem.l    (sp)+,d1-d2/d7/a0-a4
  3118.     rts
  3119.  
  3120. 95:    movem.l    (sp)+,d0-d2/a0-a1
  3121. 90:    moveq.l    #-1,d0
  3122.     bra    99b
  3123.  
  3124. ;----------------------------------------------------------------
  3125. ;パターン番号の取得
  3126. ;<d0.l:マスの番号
  3127. ;>d0.l:パターン番号(-1=パターンなし)
  3128.     .text
  3129.     .align    4,$2048
  3130. getpat1:
  3131.     movem.l    a0,-(sp)
  3132.                     ;d0=マスの番号
  3133.     lea.l    board_stat_table,a0
  3134.     add.w    d0,d0
  3135.     add.w    d0,d0
  3136.     adda.l    d0,a0            ;a0=board_stat_table上のアドレス
  3137.     move.l    (a0),d0
  3138.     movem.l    (sp)+,a0
  3139.     rts
  3140.  
  3141. ;----------------------------------------------------------------
  3142. ;ボードの各マスの状態(-1=空き,0~71=パターン番号)
  3143.     .bss
  3144.     .align    4
  3145. board_stat_table:    .ds.l    64
  3146.  
  3147. ;----------------------------------------------------------------
  3148. ;GRAMセーブエリア
  3149.     .bss
  3150.     .even
  3151. gram_save_area:
  3152.   .if GRAM_SAVE_SEPARATELY
  3153.         .ds.b    GRAM_SAVE_AREA_SIZE*64
  3154.   .else
  3155.         .ds.b    GRAM_SAVE_AREA_SIZE
  3156.   .endif
  3157.  
  3158. ;----------------------------------------------------------------
  3159. ;パターン表示
  3160. ;    スーパーバイザモードで呼び出すこと
  3161. ;    パターンの幅は63ドット以内であること
  3162. ;<a0.l:パターンの先頭
  3163. ;    .ds.w    2        ;ymin,ylen-1
  3164. ;    .ds.w    2*ylen        ;xmin(y),xlen(y)-1
  3165. ;    .ds.w    xlen(0)        ;color
  3166. ;        :
  3167. ;    .ds.w    xlen(ylen-1)
  3168. ;?d0-d1/a0-a3
  3169.     .text
  3170.     .align    4,$2048
  3171. drawpat0:
  3172.     move.w    (a0)+,d0        ;ymin
  3173.     add.w    #$00C0<<6,d0
  3174.     swap.w    d0
  3175.     clr.w    d0
  3176.     lsr.l    #6,d0
  3177.     movea.l    d0,a2            ;a2=ラスタの左端のアドレス
  3178.     move.w    (a0)+,d1        ;ylen-1
  3179.     move.w    d1,d0
  3180.     add.w    d0,d0
  3181.     add.w    d0,d0            ;リージョンデータの長さ-4
  3182.     lea.l    (4,a0,d0.w),a1        ;a1=色データの先頭
  3183.     bsr    keyctrl_vwait
  3184. 1:    move.w    (a0)+,d0        ;xmin(y)
  3185.     add.w    d0,d0
  3186.     lea.l    (a2,d0.w),a3        ;GRAM上のX方向開始アドレス
  3187.     move.w    (a0)+,d0        ;xlen(y)-1
  3188.   .if 0
  3189. @@:    move.w    (a1)+,(a3)+
  3190.     dbra    d0,@b
  3191.   .else
  3192.                     ; 0  1  2  3  4
  3193.     neg.w    d0            ; 0 -1 -2 -3 -4
  3194.     add.w    d0,d0            ; 0 -2 -4 -6 -8
  3195.     jmp    (@f,pc,d0.w)
  3196.     .rept 63-1
  3197.     move.w    (a1)+,(a3)+
  3198.     .endm
  3199. @@:    move.w    (a1)+,(a3)+
  3200.   .endif
  3201.     lea.l    (1024,a2),a2        ;次のラスタへ
  3202.     dbra    d1,1b
  3203.     rts
  3204.  
  3205. ;----------------------------------------------------------------
  3206. ;パターンデータのバッファを初期化する
  3207.     .text
  3208.     .align    4,$2048
  3209. init_patbuf:
  3210.     move.l    #-1,patbuf_cur_num
  3211.     rts
  3212.  
  3213. ;----------------------------------------------------------------
  3214. ;パターンデータを読み込む
  3215. ;<d0.l:マス目の番号(0~64)
  3216. ;>d0.l:パターンバッファの先頭,-1=エラー
  3217.     .text
  3218.     .align    4,$2048
  3219. load_pat:
  3220.     cmp.l    patbuf_cur_num,d0
  3221.     beq    98f
  3222.     move.l    d0,patbuf_cur_num
  3223.     add.w    d0,d0
  3224.     move.w    (patnam_tbl,pc,d0.w),d0
  3225.     clr.w    -(sp)
  3226.     pea.l    (patnam_tbl,pc,d0.w)
  3227.     bsr    open_file
  3228.     addq.l    #6,sp
  3229.     tst.l    d0
  3230.     bmi    90f
  3231.     move.l    #PATBUF_SIZE_UNIT,-(sp)
  3232.     pea.l    patbuf
  3233.     move.w    d0,-(sp)
  3234.     DOS    _READ
  3235.     move.l    d0,(6,sp)
  3236.     DOS    _CLOSE
  3237.     addq.l    #6,sp
  3238.     move.l    (sp)+,d0
  3239.     bmi    90f
  3240. 98:    move.l    #patbuf,d0
  3241. 99:    rts
  3242.  
  3243. 90:    moveq.l    #-1,d0
  3244.     move.l    d0,patbuf_cur_num
  3245.     bra    99b
  3246.  
  3247.     .even
  3248. patnam_tbl:
  3249.   .irpc y,01234567
  3250.     .irpc x,01234567
  3251.     .dc.w    patnam_&y&&x-patnam_tbl
  3252.     .endm
  3253.   .endm
  3254.   .irpc y,01234567
  3255.     .irpc x,01234567
  3256. patnam_&y&&x:    .dc.b    'GREVDATA/','0'+x,'0'+y,'.DAT',0
  3257.     .endm
  3258.   .endm
  3259.  
  3260. ;----------------------------------------------------------------
  3261.     .bss
  3262.     .align    4
  3263. patbuf_cur_num:    .ds.l    1
  3264.     .even
  3265. patbuf:        .ds.b    PATBUF_SIZE_UNIT
  3266.  
  3267. ;----------------------------------------------------------------
  3268. ;ボタンが押されるまで待つ
  3269. ;>d0.l:0=左ボタンが押された,-1=右ボタンが押された
  3270. ;>n-flag:mi=右ボタンが押された
  3271.     .text
  3272.     .align    4,$2048
  3273. wait_button:
  3274. 1:    IOCS    _MS_GETDT
  3275.     tst.b    d0
  3276.     bne    90f
  3277.     tst.w    d0
  3278.     beq    1b
  3279. 2:    IOCS    _MS_GETDT
  3280.     tst.b    d0
  3281.     bne    90f
  3282.     tst.w    d0
  3283.     bne    2b
  3284.     moveq.l    #0,d0
  3285. 99:    rts
  3286.  
  3287. 90:    moveq.l    #-1,d0
  3288.     bra    99b
  3289.  
  3290. ;----------------------------------------------------------------
  3291. ;手番を表示する
  3292. ;<d6.b:自分の石
  3293.     .text
  3294.     .align    4,$2048
  3295. draw_turn::
  3296.   .if 1
  3297. ;スプライトで表示
  3298.     movem.l    d0-d5,-(sp)
  3299.     bsr    super
  3300.  
  3301.     move.l    #$80000000+TURN_SPRITE,d1
  3302.  
  3303. TURN_SLIDE_UNIT    equ    (16*MOJI_WHITE_X-16*MOJI_BLACK_X)/10
  3304.  
  3305.     move.l    #16*MOJI_BLACK_Y+32+16,d3
  3306.     move.l    #TURN_PALETTE*256+TURN_PATTERN,d4
  3307.     moveq.l    #3,d5
  3308. ;<d1.l:スプライト番号,bit31=nowait
  3309. ;<d2.l:X座標+16
  3310. ;<d3.l:Y座標+16
  3311. ;<d4.l:パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
  3312. ;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
  3313.  
  3314.     cmp.b    #B,d6
  3315.     bne    10f
  3316. ;白→黒
  3317.     tst.w    turn_count
  3318.     beq    2f
  3319.     move.w    #16*MOJI_WHITE_X-1+16-TURN_SLIDE_UNIT,d2
  3320. 1:    bsr    keyctrl_vwait
  3321.     movem.l    d1-d5,-(sp)
  3322.     IOCS    _SP_REGST
  3323.     movem.l    (sp)+,d1-d5
  3324.     addq.b    #1,d1
  3325.     add.w    #26-16,d2
  3326.     movem.l    d1-d5,-(sp)
  3327.     IOCS    _SP_REGST
  3328.     movem.l    (sp)+,d1-d5
  3329.     subq.b    #1,d1
  3330.     sub.w    #26-16+TURN_SLIDE_UNIT,d2
  3331.     cmp.w    #16*MOJI_BLACK_X-1+16,d2
  3332.     bhi    1b
  3333. 2:    move.w    #16*MOJI_BLACK_X-1+16,d2
  3334.     bsr    keyctrl_vwait
  3335.     movem.l    d1-d5,-(sp)
  3336.     IOCS    _SP_REGST
  3337.     movem.l    (sp)+,d1-d5
  3338.     addq.b    #1,d1
  3339.     add.w    #26-16,d2
  3340. ;    movem.l    d1-d5,-(sp)
  3341.     IOCS    _SP_REGST
  3342. ;    movem.l    (sp)+,d1-d5
  3343.     bra    20f
  3344.  
  3345. 10:
  3346. ;黒→白
  3347.     tst.w    turn_count
  3348.     beq    2f
  3349.     move.w    #16*MOJI_BLACK_X-1+16+TURN_SLIDE_UNIT,d2
  3350. 1:    bsr    keyctrl_vwait
  3351.     movem.l    d1-d5,-(sp)
  3352.     IOCS    _SP_REGST
  3353.     movem.l    (sp)+,d1-d5
  3354.     addq.b    #1,d1
  3355.     add.w    #26-16,d2
  3356.     movem.l    d1-d5,-(sp)
  3357.     IOCS    _SP_REGST
  3358.     movem.l    (sp)+,d1-d5
  3359.     subq.b    #1,d1
  3360.     sub.w    #26-16-TURN_SLIDE_UNIT,d2
  3361.     cmp.w    #16*MOJI_WHITE_X-1+16,d2
  3362.     blo    1b
  3363. 2:    move.w    #16*MOJI_WHITE_X-1+16,d2
  3364.     bsr    keyctrl_vwait
  3365.     movem.l    d1-d5,-(sp)
  3366.     IOCS    _SP_REGST
  3367.     movem.l    (sp)+,d1-d5
  3368.     addq.b    #1,d1
  3369.     add.w    #26-16,d2
  3370. ;    movem.l    d1-d5,-(sp)
  3371.     IOCS    _SP_REGST
  3372. ;    movem.l    (sp)+,d1-d5
  3373.  
  3374. 20:
  3375.     bsr    user
  3376.     movem.l    (sp)+,d0-d5
  3377.     rts
  3378.   .else
  3379. ;テキストで表示
  3380.     movem.l    d0/d2-d3/a1,-(sp)
  3381.     lea.l    (-2*6,sp),sp
  3382.  
  3383.     cmp.b    #B,d6
  3384.     seq.b    d2
  3385.     ext.w    d2
  3386.  
  3387.     movea.l    sp,a1
  3388.     move.w    #1,(a1)+
  3389.     move.l    #((16*MOJI_BLACK_X-1)<<16)+(16*MOJI_BLACK_Y+32),(a1)+
  3390.     move.l    #((1+24+1-1)<<16)+(3-1),(a1)+
  3391.     move.w    d2,(a1)+
  3392.     movea.l    sp,a1
  3393.     IOCS    _TXFILL
  3394.  
  3395.     not.w    d2
  3396.  
  3397.     movea.l    sp,a1
  3398.     move.w    #1,(a1)+
  3399.     move.l    #((16*MOJI_WHITE_X-1)<<16)+(16*MOJI_WHITE_Y+32),(a1)+
  3400.     move.l    #((1+24+1-1)<<16)+(3-1),(a1)+
  3401.     move.w    d2,(a1)+
  3402.     movea.l    sp,a1
  3403.     IOCS    _TXFILL
  3404.  
  3405.     lea.l    (2*6,sp),sp
  3406.     movem.l    (sp)+,d0/d2-d3/a1
  3407.     rts
  3408.   .endif
  3409.  
  3410. ;----------------------------------------------------------------
  3411. ;ESCキーとTABキーでコマ送りの処理を行う
  3412.     .text
  3413.     .align    4,$2048
  3414. keyctrl:
  3415.     move.l    d0,-(sp)
  3416.     tst.b    esc_stat
  3417.     bne    20f
  3418. 10:    IOCS    _B_KEYSNS
  3419.     tst.l    d0
  3420.     beq    99f
  3421.     cmp.b    #$03,d0
  3422.     bne    @f
  3423.     DOS    _KEYSNS
  3424. @@:    IOCS    _B_KEYINP
  3425.     cmp.b    #$1B,d0
  3426.     bne    99f
  3427.     st.b    esc_stat
  3428. ;ESCが押されたとき
  3429. 20:    IOCS    _B_KEYINP
  3430.     tst.l    d0
  3431.     beq    20b
  3432.     cmp.b    #$09,d0
  3433.     beq    99f
  3434.     cmp.b    #$1B,d0
  3435.     bne    20b
  3436.     sf.b    esc_stat
  3437. 99:    move.l    (sp)+,d0
  3438.     rts
  3439.  
  3440.     .data
  3441. esc_stat:    .dc.b    0
  3442.  
  3443. ;----------------------------------------------------------------
  3444. ;垂直帰線期間待ちルーチン
  3445. ;    SHIFTキーが押されていたら待たない
  3446. ;    スーパーバイザモードで呼び出すこと
  3447.     .text
  3448.     .align    4,$2048
  3449. keyctrl_vwait:
  3450.     bsr    keyctrl
  3451. vwait:
  3452.     btst.b    #SHIFT_KEY_BIT_SHIFT,SHIFT_KEY_MAP
  3453.     bne    9f
  3454. @@:    btst.b    #4,GPIPDR        ;垂直表示期間を待つ
  3455.     beq    @b
  3456. @@:    btst.b    #4,GPIPDR        ;垂直帰線期間を待つ
  3457.     bne    @b
  3458. 9:    rts
  3459.  
  3460. ;----------------------------------------------------------------
  3461. ;ファイルをオープンする
  3462. ;    自分自身のパスを基準にする
  3463. ;<(8,sp).w:モード
  3464. ;<(4,sp).l:ファイル名
  3465. ;>d0.l:ハンドラ番号,負数=エラー
  3466.     .text
  3467.     .align    4,$2048
  3468. open_file:
  3469.     movem.l    a0-a1,-(sp)
  3470.     lea.l    (-90,sp),sp
  3471.     movea.l    sp,a0
  3472.     lea.l    prog_head-$100+$80,a1
  3473.     bsr    strcpy
  3474.     movea.l    (90+4*2+4,sp),a1
  3475.     bsr    strcpy
  3476.     move.w    (90+4*2+4+4,sp),-(sp)
  3477.     pea.l    (2,sp)
  3478.     DOS    _OPEN
  3479.     addq.l    #6,sp
  3480.     lea.l    (90,sp),sp
  3481.     movem.l    (sp)+,a0-a1
  3482.     tst.l    d0
  3483.     rts
  3484.  
  3485. ;----------------------------------------------------------------
  3486.  
  3487.